forked from qt-creator/qt-creator
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:
@@ -38,7 +38,7 @@ if (APPLE)
|
||||
set(_IDE_PLUGIN_PATH "${_IDE_OUTPUT_PATH}/PlugIns")
|
||||
set(_IDE_LIBRARY_BASE_PATH "Frameworks")
|
||||
set(_IDE_LIBRARY_PATH "${_IDE_OUTPUT_PATH}/Frameworks")
|
||||
set(_IDE_LIBEXEC_PATH "${_IDE_OUTPUT_PATH}/Resources")
|
||||
set(_IDE_LIBEXEC_PATH "${_IDE_OUTPUT_PATH}/Resources/libexec")
|
||||
set(_IDE_DATA_PATH "${_IDE_OUTPUT_PATH}/Resources")
|
||||
set(_IDE_DOC_PATH "${_IDE_OUTPUT_PATH}/Resources/doc")
|
||||
set(_IDE_BIN_PATH "${_IDE_OUTPUT_PATH}/MacOS")
|
||||
@@ -178,8 +178,12 @@ function(separate_object_libraries libraries REGULAR_LIBS OBJECT_LIBS OBJECT_LIB
|
||||
endfunction(separate_object_libraries)
|
||||
|
||||
function(set_explicit_moc target_name file)
|
||||
unset(file_dependencies)
|
||||
if (file MATCHES "^.*plugin.h$")
|
||||
set(file_dependencies DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${target_name}.json")
|
||||
endif()
|
||||
set_property(SOURCE "${file}" PROPERTY SKIP_AUTOMOC ON)
|
||||
qt5_wrap_cpp(file_moc "${file}")
|
||||
qt5_wrap_cpp(file_moc "${file}" ${file_dependencies})
|
||||
target_sources(${target_name} PRIVATE "${file_moc}")
|
||||
endfunction()
|
||||
|
||||
|
||||
2
dist/installer/mac/ios_qt.conf
vendored
2
dist/installer/mac/ios_qt.conf
vendored
@@ -1,2 +1,2 @@
|
||||
[Paths]
|
||||
Plugins = ../../PlugIns
|
||||
Plugins = ../../../PlugIns
|
||||
|
||||
5
dist/installer/mac/libexec_qt.conf
vendored
Normal file
5
dist/installer/mac/libexec_qt.conf
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
[Paths]
|
||||
Prefix = ../..
|
||||
Imports = Imports/qtquick1
|
||||
Qml2Imports = Imports/qtquick2
|
||||
Plugins = PlugIns
|
||||
7
dist/installer/mac/qmldesigner_qt.conf
vendored
7
dist/installer/mac/qmldesigner_qt.conf
vendored
@@ -1,4 +1,5 @@
|
||||
[Paths]
|
||||
Imports = ../../Imports/qtquick1
|
||||
Qml2Imports = ../../Imports/qtquick2
|
||||
Plugins = ../../PlugIns
|
||||
Prefix = ../../..
|
||||
Imports = Imports/qtquick1
|
||||
Qml2Imports = Imports/qtquick2
|
||||
Plugins = PlugIns
|
||||
|
||||
@@ -48,7 +48,7 @@ Module {
|
||||
? ide_app_target + ".app/Contents/Resources"
|
||||
: "share/qtcreator"
|
||||
property string ide_libexec_path: qbs.targetOS.contains("macos")
|
||||
? ide_data_path : qbs.targetOS.contains("windows")
|
||||
? ide_data_path + "/libexec" : qbs.targetOS.contains("windows")
|
||||
? ide_app_path
|
||||
: "libexec/qtcreator"
|
||||
property string ide_bin_path: qbs.targetOS.contains("macos")
|
||||
|
||||
@@ -107,7 +107,7 @@ osx {
|
||||
|
||||
IDE_LIBRARY_PATH = $$IDE_OUTPUT_PATH/Frameworks
|
||||
IDE_PLUGIN_PATH = $$IDE_OUTPUT_PATH/PlugIns
|
||||
IDE_LIBEXEC_PATH = $$IDE_OUTPUT_PATH/Resources
|
||||
IDE_LIBEXEC_PATH = $$IDE_OUTPUT_PATH/Resources/libexec
|
||||
IDE_DATA_PATH = $$IDE_OUTPUT_PATH/Resources
|
||||
IDE_DOC_PATH = $$IDE_DATA_PATH/doc
|
||||
IDE_BIN_PATH = $$IDE_OUTPUT_PATH/MacOS
|
||||
@@ -118,7 +118,7 @@ osx {
|
||||
|
||||
INSTALL_LIBRARY_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/Frameworks
|
||||
INSTALL_PLUGIN_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/PlugIns
|
||||
INSTALL_LIBEXEC_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/Resources
|
||||
INSTALL_LIBEXEC_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/Resources/libexec
|
||||
INSTALL_DATA_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/Resources
|
||||
INSTALL_DOC_PATH = $$INSTALL_DATA_PATH/doc
|
||||
INSTALL_BIN_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/MacOS
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
|
||||
app_path="$1"
|
||||
resource_path="$app_path/Contents/Resources"
|
||||
libexec_path="$app_path/Contents/Resources/libexec"
|
||||
bin_src="$2"
|
||||
translation_src="$3"
|
||||
plugin_src="$4"
|
||||
@@ -76,6 +77,7 @@ if [ -d "$quick1_src" ]; then
|
||||
echo "- Copying Qt Quick 1 imports"
|
||||
mkdir -p "$importsDir"
|
||||
cp -R "$quick1_src"/ "$importsDir"/
|
||||
find "$importsDir" -path "*.dylib.dSYM*" -delete
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -86,6 +88,7 @@ if [ -d "$quick2_src" ]; then
|
||||
echo "- Copying Qt Quick 2 imports"
|
||||
mkdir -p "$imports2Dir"
|
||||
cp -R "$quick2_src"/ "$imports2Dir"/
|
||||
find "$imports2Dir" -path "*.dylib.dSYM*" -delete
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -95,16 +98,22 @@ if [ ! -f "$resource_path/qt.conf" ]; then
|
||||
cp -f "$(dirname "${BASH_SOURCE[0]}")/../dist/installer/mac/qt.conf" "$resource_path/qt.conf" || exit 1
|
||||
fi
|
||||
|
||||
# copy libexec tools' qt.conf
|
||||
if [ ! -f "$libexec_path/qt.conf" ]; then
|
||||
echo "- Copying libexec/qt.conf"
|
||||
cp -f "$(dirname "${BASH_SOURCE[0]}")/../dist/installer/mac/libexec_qt.conf" "$libexec_path/qt.conf" || exit 1
|
||||
fi
|
||||
|
||||
# copy ios tools' qt.conf
|
||||
if [ ! -f "$resource_path/ios/qt.conf" ]; then
|
||||
echo "- Copying ios/qt.conf"
|
||||
cp -f "$(dirname "${BASH_SOURCE[0]}")/../dist/installer/mac/ios_qt.conf" "$resource_path/ios/qt.conf" || exit 1
|
||||
if [ ! -f "$libexec_path/ios/qt.conf" ]; then
|
||||
echo "- Copying libexec/ios/qt.conf"
|
||||
cp -f "$(dirname "${BASH_SOURCE[0]}")/../dist/installer/mac/ios_qt.conf" "$libexec_path/ios/qt.conf" || exit 1
|
||||
fi
|
||||
|
||||
# copy qml2puppet's qt.conf
|
||||
if [ ! -f "$resource_path/qmldesigner/qt.conf" ]; then
|
||||
echo "- Copying qmldesigner/qt.conf"
|
||||
cp -f "$(dirname "${BASH_SOURCE[0]}")/../dist/installer/mac/qmldesigner_qt.conf" "$resource_path/qmldesigner/qt.conf" || exit 1
|
||||
if [ ! -f "$libexec_path/qmldesigner/qt.conf" ]; then
|
||||
echo "- Copying libexec/qmldesigner/qt.conf"
|
||||
cp -f "$(dirname "${BASH_SOURCE[0]}")/../dist/installer/mac/qmldesigner_qt.conf" "$libexec_path/qmldesigner/qt.conf" || exit 1
|
||||
fi
|
||||
|
||||
# copy Qt translations
|
||||
@@ -120,50 +129,40 @@ if [ $LLVM_INSTALL_DIR ]; then
|
||||
echo "- Copying libclang"
|
||||
mkdir -p "$app_path/Contents/Frameworks" || exit 1
|
||||
# use recursive copy to make it copy symlinks as symlinks
|
||||
mkdir -p "$resource_path/clang/bin"
|
||||
mkdir -p "$resource_path/clang/lib"
|
||||
mkdir -p "$libexec_path/clang/bin"
|
||||
mkdir -p "$libexec_path/clang/lib"
|
||||
cp -Rf "$LLVM_INSTALL_DIR"/lib/libclang.*dylib "$app_path/Contents/Frameworks/" || exit 1
|
||||
cp -Rf "$LLVM_INSTALL_DIR"/lib/clang "$resource_path/clang/lib/" || exit 1
|
||||
cp -Rf "$LLVM_INSTALL_DIR"/lib/clang "$libexec_path/clang/lib/" || exit 1
|
||||
clangsource="$LLVM_INSTALL_DIR"/bin/clang
|
||||
clanglinktarget="$(readlink "$clangsource")"
|
||||
cp -Rf "$clangsource" "$resource_path/clang/bin/" || exit 1
|
||||
cp -Rf "$clangsource" "$libexec_path/clang/bin/" || exit 1
|
||||
if [ $clanglinktarget ]; then
|
||||
cp -Rf "$(dirname "$clangsource")/$clanglinktarget" "$resource_path/clang/bin/$clanglinktarget" || exit 1
|
||||
cp -Rf "$(dirname "$clangsource")/$clanglinktarget" "$libexec_path/clang/bin/$clanglinktarget" || exit 1
|
||||
fi
|
||||
clangdsource="$LLVM_INSTALL_DIR"/bin/clangd
|
||||
cp -Rf "$clangdsource" "$resource_path/clang/bin/" || exit 1
|
||||
cp -Rf "$clangdsource" "$libexec_path/clang/bin/" || exit 1
|
||||
clangtidysource="$LLVM_INSTALL_DIR"/bin/clang-tidy
|
||||
cp -Rf "$clangtidysource" "$resource_path/clang/bin/" || exit 1
|
||||
cp -Rf "$clangtidysource" "$libexec_path/clang/bin/" || exit 1
|
||||
clazysource="$LLVM_INSTALL_DIR"/bin/clazy-standalone
|
||||
cp -Rf "$clazysource" "$resource_path/clang/bin/" || exit 1
|
||||
cp -Rf "$clazysource" "$libexec_path/clang/bin/" || exit 1
|
||||
fi
|
||||
clangbackendArgument="-executable=$resource_path/clangbackend"
|
||||
clangpchmanagerArgument="-executable=$resource_path/clangpchmanagerbackend"
|
||||
clangrefactoringArgument="-executable=$resource_path/clangrefactoringbackend"
|
||||
clangbackendArgument="-executable=$libexec_path/clangbackend"
|
||||
clangpchmanagerArgument="-executable=$libexec_path/clangpchmanagerbackend"
|
||||
clangrefactoringArgument="-executable=$libexec_path/clangrefactoringbackend"
|
||||
fi
|
||||
|
||||
#### macdeployqt
|
||||
|
||||
if [ ! -d "$app_path/Contents/Frameworks/QtCore.framework" ]; then
|
||||
|
||||
qml2puppetapp="$resource_path/qmldesigner/qml2puppet"
|
||||
qml2puppetapp="$libexec_path/qmldesigner/qml2puppet"
|
||||
if [ -f "$qml2puppetapp" ]; then
|
||||
qml2puppetArgument="-executable=$qml2puppetapp"
|
||||
fi
|
||||
|
||||
qbsapp="$app_path/Contents/MacOS/qbs"
|
||||
|
||||
echo "- Running macdeployqt ($bin_src/macdeployqt)"
|
||||
|
||||
"$bin_src/macdeployqt" "$app_path" \
|
||||
"-executable=$app_path/Contents/MacOS/qtdiag" \
|
||||
"-executable=$resource_path/qtpromaker" \
|
||||
"-executable=$resource_path/sdktool" \
|
||||
"-executable=$resource_path/ios/iostool" \
|
||||
"-executable=$resource_path/buildoutputparser" \
|
||||
"-executable=$resource_path/cpaster" \
|
||||
"-executable=$resource_path/qbs_processlauncher" \
|
||||
"-executable=$qbsapp" \
|
||||
if [ -f "$qbsapp" ]; then
|
||||
qbsArguments=("-executable=$qbsapp" \
|
||||
"-executable=$qbsapp-config" \
|
||||
"-executable=$qbsapp-config-ui" \
|
||||
"-executable=$qbsapp-qmltypes" \
|
||||
@@ -171,6 +170,19 @@ if [ ! -d "$app_path/Contents/Frameworks/QtCore.framework" ]; then
|
||||
"-executable=$qbsapp-setup-qt" \
|
||||
"-executable=$qbsapp-setup-toolchains" \
|
||||
"-executable=$qbsapp-create-project" \
|
||||
"-executable=$libexec_path/qbs_processlauncher")
|
||||
fi
|
||||
|
||||
echo "- Running macdeployqt ($bin_src/macdeployqt)"
|
||||
|
||||
"$bin_src/macdeployqt" "$app_path" \
|
||||
"-executable=$app_path/Contents/MacOS/qtdiag" \
|
||||
"-executable=$libexec_path/qtpromaker" \
|
||||
"-executable=$libexec_path/sdktool" \
|
||||
"-executable=$libexec_path/ios/iostool" \
|
||||
"-executable=$libexec_path/buildoutputparser" \
|
||||
"-executable=$libexec_path/cpaster" \
|
||||
"${qbsArguments[@]}" \
|
||||
"$qml2puppetArgument" \
|
||||
"$clangbackendArgument" "$clangpchmanagerArgument" "$clangrefactoringArgument" || exit 1
|
||||
|
||||
|
||||
@@ -27,104 +27,29 @@ import QtQuick 2.0
|
||||
import QtQuick3D 1.0
|
||||
import MouseArea3D 1.0
|
||||
|
||||
Model {
|
||||
DirectionalDraggable {
|
||||
id: arrow
|
||||
rotationOrder: Node.XYZr
|
||||
source: "meshes/arrow.mesh"
|
||||
|
||||
property View3D view3D
|
||||
property alias color: material.emissiveColor
|
||||
property Node targetNode: null
|
||||
property bool dragging: false
|
||||
|
||||
readonly property bool hovering: mouseAreaYZ.hovering || mouseAreaXZ.hovering
|
||||
|
||||
property var _pointerPosPressed
|
||||
property var _targetStartPos
|
||||
|
||||
signal positionCommit()
|
||||
signal positionMove()
|
||||
|
||||
materials: DefaultMaterial {
|
||||
id: material
|
||||
emissiveColor: "white"
|
||||
lighting: DefaultMaterial.NoLighting
|
||||
}
|
||||
|
||||
function handlePressed(mouseArea, pointerPosition)
|
||||
function localPos(sceneRelativeDistance)
|
||||
{
|
||||
if (!targetNode)
|
||||
return;
|
||||
|
||||
var maskedPosition = Qt.vector3d(pointerPosition.x, 0, 0);
|
||||
_pointerPosPressed = mouseArea.mapPositionToScene(maskedPosition);
|
||||
var sp = targetNode.scenePosition;
|
||||
_targetStartPos = Qt.vector3d(sp.x, sp.y, sp.z);
|
||||
dragging = true;
|
||||
}
|
||||
|
||||
function posInParent(mouseArea, pointerPosition)
|
||||
{
|
||||
var maskedPosition = Qt.vector3d(pointerPosition.x, 0, 0);
|
||||
var scenePointerPos = mouseArea.mapPositionToScene(maskedPosition);
|
||||
var sceneRelativeDistance = Qt.vector3d(
|
||||
scenePointerPos.x - _pointerPosPressed.x,
|
||||
scenePointerPos.y - _pointerPosPressed.y,
|
||||
scenePointerPos.z - _pointerPosPressed.z);
|
||||
|
||||
var newScenePos = Qt.vector3d(
|
||||
_targetStartPos.x + sceneRelativeDistance.x,
|
||||
_targetStartPos.y + sceneRelativeDistance.y,
|
||||
_targetStartPos.z + sceneRelativeDistance.z);
|
||||
|
||||
return targetNode.parent.mapPositionFromScene(newScenePos);
|
||||
}
|
||||
|
||||
function handleDragged(mouseArea, pointerPosition)
|
||||
{
|
||||
if (!targetNode)
|
||||
return;
|
||||
|
||||
targetNode.position = posInParent(mouseArea, pointerPosition);
|
||||
arrow.positionMove();
|
||||
onDragged: {
|
||||
targetNode.position = localPos(sceneRelativeDistance);
|
||||
positionMove();
|
||||
}
|
||||
|
||||
function handleReleased(mouseArea, pointerPosition)
|
||||
{
|
||||
if (!targetNode)
|
||||
return;
|
||||
|
||||
targetNode.position = posInParent(mouseArea, pointerPosition);
|
||||
dragging = false;
|
||||
arrow.positionCommit();
|
||||
}
|
||||
|
||||
MouseArea3D {
|
||||
id: mouseAreaYZ
|
||||
view3D: arrow.view3D
|
||||
x: 0
|
||||
y: -1.5
|
||||
width: 12
|
||||
height: 3
|
||||
rotation: Qt.vector3d(0, 0, 90)
|
||||
grabsMouse: targetNode
|
||||
onPressed: arrow.handlePressed(mouseAreaYZ, pointerPosition)
|
||||
onDragged: arrow.handleDragged(mouseAreaYZ, pointerPosition)
|
||||
onReleased: arrow.handleReleased(mouseAreaYZ, pointerPosition)
|
||||
}
|
||||
|
||||
MouseArea3D {
|
||||
id: mouseAreaXZ
|
||||
view3D: arrow.view3D
|
||||
x: 0
|
||||
y: -1.5
|
||||
width: 12
|
||||
height: 3
|
||||
rotation: Qt.vector3d(0, 90, 90)
|
||||
grabsMouse: targetNode
|
||||
onPressed: arrow.handlePressed(mouseAreaXZ, pointerPosition)
|
||||
onDragged: arrow.handleDragged(mouseAreaXZ, pointerPosition)
|
||||
onReleased: arrow.handleReleased(mouseAreaXZ, pointerPosition)
|
||||
onReleased: {
|
||||
targetNode.position = localPos(sceneRelativeDistance);
|
||||
positionCommit();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,17 +25,27 @@
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick3D 1.0
|
||||
import CameraGeometry 1.0
|
||||
|
||||
IconGizmo {
|
||||
id: cameraGizmo
|
||||
|
||||
iconSource: "qrc:///qtquickplugin/mockfiles/images/camera-pick-icon.png"
|
||||
gizmoModel.source: "#Cube"
|
||||
gizmoModel.geometry: cameraGeometry
|
||||
property alias geometryName: cameraGeometry.name // Name must be unique for each geometry
|
||||
property alias viewPortRect: cameraGeometry.viewPortRect
|
||||
|
||||
CameraGeometry {
|
||||
id: cameraGeometry
|
||||
camera: cameraGizmo.targetNode
|
||||
}
|
||||
|
||||
gizmoModel.materials: [
|
||||
DefaultMaterial {
|
||||
id: defaultMaterial
|
||||
emissiveColor: "blue"
|
||||
lighting: DefaultMaterial.NoLighting
|
||||
cullingMode: Material.DisableCulling
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
124
share/qtcreator/qml/qmlpuppet/mockfiles/DirectionalDraggable.qml
Normal file
124
share/qtcreator/qml/qmlpuppet/mockfiles/DirectionalDraggable.qml
Normal 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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ Window {
|
||||
title: "3D"
|
||||
flags: Qt.WindowStaysOnTopHint | Qt.Window | Qt.WindowTitleHint | Qt.WindowCloseButtonHint
|
||||
|
||||
property alias scene: editView.scene
|
||||
property alias scene: editView.importScene
|
||||
property alias showEditLight: editLightCheckbox.checked
|
||||
property alias usePerspective: usePerspectiveCheckbox.checked
|
||||
|
||||
@@ -46,10 +46,11 @@ Window {
|
||||
|
||||
property var lightGizmos: []
|
||||
property var cameraGizmos: []
|
||||
property rect viewPortRect: Qt.rect(0, 0, 1000, 1000)
|
||||
|
||||
signal objectClicked(var object)
|
||||
signal commitObjectPosition(var object)
|
||||
signal moveObjectPosition(var object)
|
||||
signal commitObjectProperty(var object, var propName)
|
||||
signal changeObjectProperty(var object, var propName)
|
||||
|
||||
function selectObject(object) {
|
||||
selectedNode = object;
|
||||
@@ -75,10 +76,14 @@ Window {
|
||||
{
|
||||
var component = Qt.createComponent("CameraGizmo.qml");
|
||||
if (component.status === Component.Ready) {
|
||||
var gizmo = component.createObject(overlayScene,
|
||||
{"view3D": overlayView, "targetNode": obj});
|
||||
var geometryName = designStudioNativeCameraControlHelper.generateUniqueName("CameraGeometry");
|
||||
var gizmo = component.createObject(
|
||||
overlayScene,
|
||||
{"view3D": overlayView, "targetNode": obj, "geometryName": geometryName,
|
||||
"viewPortRect": viewPortRect});
|
||||
cameraGizmos[cameraGizmos.length] = gizmo;
|
||||
gizmo.selected.connect(emitObjectClicked);
|
||||
gizmo.viewPortRect = Qt.binding(function() {return viewPortRect;});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,11 +118,26 @@ Window {
|
||||
position: viewWindow.selectedNode ? viewWindow.selectedNode.scenePosition
|
||||
: Qt.vector3d(0, 0, 0)
|
||||
globalOrientation: globalControl.checked
|
||||
visible: selectedNode
|
||||
visible: selectedNode && moveToolControl.checked
|
||||
view3D: overlayView
|
||||
|
||||
onPositionCommit: viewWindow.commitObjectPosition(selectedNode)
|
||||
onPositionMove: viewWindow.moveObjectPosition(selectedNode)
|
||||
onPositionCommit: viewWindow.commitObjectProperty(selectedNode, "position")
|
||||
onPositionMove: viewWindow.changeObjectProperty(selectedNode, "position")
|
||||
}
|
||||
|
||||
ScaleGizmo {
|
||||
id: scaleGizmo
|
||||
scale: autoScale.getScale(Qt.vector3d(5, 5, 5))
|
||||
highlightOnHover: true
|
||||
targetNode: viewWindow.selectedNode
|
||||
position: viewWindow.selectedNode ? viewWindow.selectedNode.scenePosition
|
||||
: Qt.vector3d(0, 0, 0)
|
||||
globalOrientation: globalControl.checked
|
||||
visible: selectedNode && scaleToolControl.checked
|
||||
view3D: overlayView
|
||||
|
||||
onScaleCommit: viewWindow.commitObjectProperty(selectedNode, "scale")
|
||||
onScaleChange: viewWindow.changeObjectProperty(selectedNode, "scale")
|
||||
}
|
||||
|
||||
AutoScaleHelper {
|
||||
@@ -156,10 +176,12 @@ Window {
|
||||
}
|
||||
|
||||
PointLight {
|
||||
id: pointLight
|
||||
id: editLight
|
||||
visible: showEditLight
|
||||
position: usePerspective ? editPerspectiveCamera.position
|
||||
: editOrthoCamera.position
|
||||
quadraticFade: 0
|
||||
linearFade: 0
|
||||
}
|
||||
|
||||
PerspectiveCamera {
|
||||
@@ -181,16 +203,16 @@ Window {
|
||||
id: overlayView
|
||||
anchors.fill: parent
|
||||
camera: usePerspective ? overlayPerspectiveCamera : overlayOrthoCamera
|
||||
scene: overlayScene
|
||||
importScene: overlayScene
|
||||
}
|
||||
|
||||
Overlay2D {
|
||||
id: gizmoLabel
|
||||
targetNode: moveGizmo
|
||||
targetNode: moveGizmo.visible ? moveGizmo : scaleGizmo
|
||||
targetView: overlayView
|
||||
offsetX: 0
|
||||
offsetY: 45
|
||||
visible: moveGizmo.dragging
|
||||
visible: targetNode.dragging
|
||||
|
||||
Rectangle {
|
||||
color: "white"
|
||||
@@ -203,11 +225,18 @@ Window {
|
||||
id: gizmoLabelText
|
||||
text: {
|
||||
var l = Qt.locale();
|
||||
selectedNode
|
||||
? qsTr("x:") + Number(selectedNode.position.x).toLocaleString(l, 'f', 1)
|
||||
+ qsTr(" y:") + Number(selectedNode.position.y).toLocaleString(l, 'f', 1)
|
||||
+ qsTr(" z:") + Number(selectedNode.position.z).toLocaleString(l, 'f', 1)
|
||||
: "";
|
||||
var targetProperty;
|
||||
if (viewWindow.selectedNode) {
|
||||
if (gizmoLabel.targetNode === moveGizmo)
|
||||
targetProperty = viewWindow.selectedNode.position;
|
||||
else
|
||||
targetProperty = viewWindow.selectedNode.scale;
|
||||
return qsTr("x:") + Number(targetProperty.x).toLocaleString(l, 'f', 1)
|
||||
+ qsTr(" y:") + Number(targetProperty.y).toLocaleString(l, 'f', 1)
|
||||
+ qsTr(" z:") + Number(targetProperty.z).toLocaleString(l, 'f', 1);
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
@@ -252,6 +281,19 @@ Window {
|
||||
text: qsTr("Use Global Orientation")
|
||||
onCheckedChanged: cameraControl.forceActiveFocus()
|
||||
}
|
||||
Column {
|
||||
x: 8
|
||||
RadioButton {
|
||||
id: moveToolControl
|
||||
checked: true
|
||||
text: qsTr("Move Tool")
|
||||
}
|
||||
RadioButton {
|
||||
id: scaleToolControl
|
||||
checked: false
|
||||
text: qsTr("Scale Tool")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
|
||||
@@ -45,7 +45,6 @@ Node {
|
||||
|
||||
Model {
|
||||
id: gizmoModel
|
||||
scale: Qt.vector3d(0.05, 0.05, 0.05)
|
||||
visible: iconGizmo.visible
|
||||
}
|
||||
Overlay2D {
|
||||
|
||||
@@ -31,6 +31,7 @@ IconGizmo {
|
||||
|
||||
iconSource: "qrc:///qtquickplugin/mockfiles/images/light-pick-icon.png"
|
||||
gizmoModel.source: "#Sphere"
|
||||
gizmoModel.scale: Qt.vector3d(0.10, 0.10, 0.10)
|
||||
gizmoModel.materials: [
|
||||
DefaultMaterial {
|
||||
id: defaultMaterial
|
||||
|
||||
@@ -35,7 +35,8 @@ Node {
|
||||
property Node targetNode: null
|
||||
property bool globalOrientation: true
|
||||
readonly property bool dragging: arrowX.dragging || arrowY.dragging || arrowZ.dragging
|
||||
|| centerMouseArea.dragging
|
||||
|| planeX.dragging || planeY.dragging || planeZ.dragging
|
||||
|| centerBall.dragging
|
||||
|
||||
signal positionCommit()
|
||||
signal positionMove()
|
||||
@@ -45,12 +46,12 @@ Node {
|
||||
|
||||
Arrow {
|
||||
id: arrowX
|
||||
objectName: "Arrow X"
|
||||
rotation: Qt.vector3d(0, 0, -90)
|
||||
targetNode: moveGizmo.targetNode
|
||||
color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(1, 0, 0, 1))
|
||||
: Qt.rgba(1, 0, 0, 1)
|
||||
view3D: moveGizmo.view3D
|
||||
active: moveGizmo.visible
|
||||
|
||||
onPositionCommit: moveGizmo.positionCommit()
|
||||
onPositionMove: moveGizmo.positionMove()
|
||||
@@ -58,12 +59,12 @@ Node {
|
||||
|
||||
Arrow {
|
||||
id: arrowY
|
||||
objectName: "Arrow Y"
|
||||
rotation: Qt.vector3d(0, 0, 0)
|
||||
targetNode: moveGizmo.targetNode
|
||||
color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0, 1, 1))
|
||||
: Qt.rgba(0, 0, 1, 1)
|
||||
color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0.6, 0, 1))
|
||||
: Qt.rgba(0, 0.6, 0, 1)
|
||||
view3D: moveGizmo.view3D
|
||||
active: moveGizmo.visible
|
||||
|
||||
onPositionCommit: moveGizmo.positionCommit()
|
||||
onPositionMove: moveGizmo.positionMove()
|
||||
@@ -71,85 +72,83 @@ Node {
|
||||
|
||||
Arrow {
|
||||
id: arrowZ
|
||||
objectName: "Arrow Z"
|
||||
rotation: Qt.vector3d(90, 0, 0)
|
||||
targetNode: moveGizmo.targetNode
|
||||
color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0.6, 0, 1))
|
||||
: Qt.rgba(0, 0.6, 0, 1)
|
||||
color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0, 1, 1))
|
||||
: Qt.rgba(0, 0, 1, 1)
|
||||
view3D: moveGizmo.view3D
|
||||
active: moveGizmo.visible
|
||||
|
||||
onPositionCommit: moveGizmo.positionCommit()
|
||||
onPositionMove: moveGizmo.positionMove()
|
||||
}
|
||||
|
||||
PlanarMoveHandle {
|
||||
id: planeX
|
||||
|
||||
y: 10
|
||||
z: 10
|
||||
|
||||
rotation: Qt.vector3d(0, 90, 0)
|
||||
targetNode: moveGizmo.targetNode
|
||||
color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(1, 0, 0, 1))
|
||||
: Qt.rgba(1, 0, 0, 1)
|
||||
view3D: moveGizmo.view3D
|
||||
active: moveGizmo.visible
|
||||
|
||||
onPositionCommit: moveGizmo.positionCommit()
|
||||
onPositionMove: moveGizmo.positionMove()
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
source: "#Sphere"
|
||||
scale: Qt.vector3d(0.024, 0.024, 0.024)
|
||||
materials: DefaultMaterial {
|
||||
id: material
|
||||
emissiveColor: highlightOnHover
|
||||
&& (centerMouseArea.hovering || centerMouseArea.dragging)
|
||||
? Qt.lighter(Qt.rgba(0.5, 0.5, 0.5, 1))
|
||||
color: highlightOnHover && (hovering || 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: moveGizmo.view3D
|
||||
x: -60
|
||||
y: -60
|
||||
width: 120
|
||||
height: 120
|
||||
rotation: view3D.camera.rotation
|
||||
grabsMouse: moveGizmo.targetNode
|
||||
priority: 1
|
||||
targetNode: moveGizmo.targetNode
|
||||
|
||||
property var _pointerPosPressed
|
||||
property var _targetStartPos
|
||||
view3D: moveGizmo.view3D
|
||||
active: moveGizmo.visible
|
||||
|
||||
function posInParent(pointerPosition)
|
||||
{
|
||||
var scenePointerPos = mapPositionToScene(pointerPosition);
|
||||
var sceneRelativeDistance = Qt.vector3d(
|
||||
scenePointerPos.x - _pointerPosPressed.x,
|
||||
scenePointerPos.y - _pointerPosPressed.y,
|
||||
scenePointerPos.z - _pointerPosPressed.z);
|
||||
|
||||
var newScenePos = Qt.vector3d(
|
||||
_targetStartPos.x + sceneRelativeDistance.x,
|
||||
_targetStartPos.y + sceneRelativeDistance.y,
|
||||
_targetStartPos.z + sceneRelativeDistance.z);
|
||||
|
||||
return moveGizmo.targetNode.parent.mapPositionFromScene(newScenePos);
|
||||
}
|
||||
|
||||
onPressed: {
|
||||
if (!moveGizmo.targetNode)
|
||||
return;
|
||||
|
||||
_pointerPosPressed = mapPositionToScene(pointerPosition);
|
||||
var sp = moveGizmo.targetNode.scenePosition;
|
||||
_targetStartPos = Qt.vector3d(sp.x, sp.y, sp.z);
|
||||
}
|
||||
onDragged: {
|
||||
if (!moveGizmo.targetNode)
|
||||
return;
|
||||
|
||||
moveGizmo.targetNode.position = posInParent(pointerPosition);
|
||||
moveGizmo.positionMove();
|
||||
}
|
||||
onReleased: {
|
||||
if (!moveGizmo.targetNode)
|
||||
return;
|
||||
|
||||
moveGizmo.targetNode.position = posInParent(pointerPosition);
|
||||
moveGizmo.positionCommit();
|
||||
}
|
||||
}
|
||||
onPositionCommit: moveGizmo.positionCommit()
|
||||
onPositionMove: moveGizmo.positionMove()
|
||||
}
|
||||
}
|
||||
|
||||
111
share/qtcreator/qml/qmlpuppet/mockfiles/PlanarDraggable.qml
Normal file
111
share/qtcreator/qml/qmlpuppet/mockfiles/PlanarDraggable.qml
Normal 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)
|
||||
}
|
||||
}
|
||||
|
||||
55
share/qtcreator/qml/qmlpuppet/mockfiles/PlanarMoveHandle.qml
Normal file
55
share/qtcreator/qml/qmlpuppet/mockfiles/PlanarMoveHandle.qml
Normal 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();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
214
share/qtcreator/qml/qmlpuppet/mockfiles/ScaleGizmo.qml
Normal file
214
share/qtcreator/qml/qmlpuppet/mockfiles/ScaleGizmo.qml
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
72
share/qtcreator/qml/qmlpuppet/mockfiles/ScaleRod.qml
Normal file
72
share/qtcreator/qml/qmlpuppet/mockfiles/ScaleRod.qml
Normal 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();
|
||||
}
|
||||
}
|
||||
BIN
share/qtcreator/qml/qmlpuppet/mockfiles/meshes/scalerod.mesh
Normal file
BIN
share/qtcreator/qml/qmlpuppet/mockfiles/meshes/scalerod.mesh
Normal file
Binary file not shown.
@@ -24,6 +24,8 @@
|
||||
****************************************************************************/
|
||||
#include "cameracontrolhelper.h"
|
||||
|
||||
#include <QHash>
|
||||
|
||||
namespace QmlDesigner {
|
||||
namespace Internal {
|
||||
|
||||
@@ -65,5 +67,12 @@ void CameraControlHelper::requestOverlayUpdate()
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ public:
|
||||
void setEnabled(bool enabled);
|
||||
|
||||
Q_INVOKABLE void requestOverlayUpdate();
|
||||
Q_INVOKABLE QString generateUniqueName(const QString &nameRoot);
|
||||
|
||||
public slots:
|
||||
void handleUpdateTimer();
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -1,5 +1,7 @@
|
||||
HEADERS += $$PWD/cameracontrolhelper.h \
|
||||
$$PWD/mousearea3d.h
|
||||
$$PWD/mousearea3d.h \
|
||||
$$PWD/camerageometry.h
|
||||
|
||||
SOURCES += $$PWD/cameracontrolhelper.cpp \
|
||||
$$PWD/mousearea3d.cpp
|
||||
$$PWD/mousearea3d.cpp \
|
||||
$$PWD/camerageometry.cpp
|
||||
|
||||
@@ -60,6 +60,11 @@ bool MouseArea3D::grabsMouse() const
|
||||
return m_grabsMouse;
|
||||
}
|
||||
|
||||
bool MouseArea3D::active() const
|
||||
{
|
||||
return m_active;
|
||||
}
|
||||
|
||||
qreal MouseArea3D::x() const
|
||||
{
|
||||
return m_x;
|
||||
@@ -103,6 +108,15 @@ void MouseArea3D::setGrabsMouse(bool grabsMouse)
|
||||
emit grabsMouseChanged(grabsMouse);
|
||||
}
|
||||
|
||||
void MouseArea3D::setActive(bool active)
|
||||
{
|
||||
if (m_active == active)
|
||||
return;
|
||||
|
||||
m_active = active;
|
||||
emit activeChanged(active);
|
||||
}
|
||||
|
||||
void MouseArea3D::setX(qreal x)
|
||||
{
|
||||
if (qFuzzyCompare(m_x, x))
|
||||
@@ -190,6 +204,80 @@ QVector3D MouseArea3D::rayIntersectsPlane(const QVector3D &rayPos0,
|
||||
return rayPos0 + distanceFromRayPos0ToPlane * rayDirection;
|
||||
}
|
||||
|
||||
// Get a new scale based on a relative scene distance along a drag axis.
|
||||
// This function never returns a negative scaling.
|
||||
// Note that scaling a rotated object in global coordinate space can't be meaningfully done without
|
||||
// distorting the object beyond what current scale property can represent, so global scaling is
|
||||
// effectively same as local scaling.
|
||||
QVector3D MouseArea3D::getNewScale(QQuick3DNode *node, const QVector3D &startScale,
|
||||
const QVector3D &pressPos,
|
||||
const QVector3D &sceneRelativeDistance, bool global)
|
||||
{
|
||||
if (node) {
|
||||
// Note: This only returns correct scale when scale is positive
|
||||
auto getScale = [&](const QMatrix4x4 &m) -> QVector3D {
|
||||
return QVector3D(m.column(0).length(), m.column(1).length(), m.column(2).length());
|
||||
};
|
||||
const float nonZeroValue = 0.0001f;
|
||||
|
||||
const QVector3D scenePos = node->scenePosition();
|
||||
const QMatrix4x4 parentTransform = node->parentNode()->sceneTransform();
|
||||
QMatrix4x4 newTransform = node->sceneTransform();
|
||||
const QVector3D nodeToPressPos = pressPos - scenePos;
|
||||
const QVector3D nodeToRelPos = nodeToPressPos + sceneRelativeDistance;
|
||||
const float sceneToPressLen = nodeToPressPos.length();
|
||||
QVector3D scaleDirVector = nodeToRelPos;
|
||||
float magnitude = (scaleDirVector.length() / sceneToPressLen);
|
||||
scaleDirVector.normalize();
|
||||
|
||||
// Reset everything but rotation to ensure translation and scale don't affect rotation below
|
||||
newTransform(0, 3) = 0;
|
||||
newTransform(1, 3) = 0;
|
||||
newTransform(2, 3) = 0;
|
||||
QVector3D curScale = getScale(newTransform);
|
||||
if (qFuzzyIsNull(curScale.x()))
|
||||
curScale.setX(nonZeroValue);
|
||||
if (qFuzzyIsNull(curScale.y()))
|
||||
curScale.setY(nonZeroValue);
|
||||
if (qFuzzyIsNull(curScale.z()))
|
||||
curScale.setZ(nonZeroValue);
|
||||
newTransform.scale({1.f / curScale.x(), 1.f / curScale.y(), 1.f / curScale.z()});
|
||||
|
||||
// Rotate the local scale vector so that scale axes are parallel to global axes for easier
|
||||
// scale vector manipulation
|
||||
if (!global)
|
||||
scaleDirVector = newTransform.inverted().map(scaleDirVector).normalized();
|
||||
|
||||
// Ensure scaling is always positive/negative according to direction
|
||||
scaleDirVector.setX(qAbs(scaleDirVector.x()));
|
||||
scaleDirVector.setY(qAbs(scaleDirVector.y()));
|
||||
scaleDirVector.setZ(qAbs(scaleDirVector.z()));
|
||||
|
||||
// Make sure the longest scale vec axis is equal to 1 before applying magnitude to avoid
|
||||
// initial jump in size when planar drag starts
|
||||
float maxDir = qMax(qMax(scaleDirVector.x(), scaleDirVector.y()), scaleDirVector.z());
|
||||
QVector3D scaleVec = scaleDirVector / maxDir;
|
||||
scaleVec *= magnitude;
|
||||
|
||||
// Zero axes on scale vector indicate directions we don't want scaling to affect
|
||||
if (qFuzzyIsNull(scaleVec.x()))
|
||||
scaleVec.setX(1.f);
|
||||
if (qFuzzyIsNull(scaleVec.y()))
|
||||
scaleVec.setY(1.f);
|
||||
if (qFuzzyIsNull(scaleVec.z()))
|
||||
scaleVec.setZ(1.f);
|
||||
scaleVec *= startScale;
|
||||
|
||||
newTransform = parentTransform;
|
||||
newTransform.scale(scaleVec);
|
||||
|
||||
const QMatrix4x4 localTransform = parentTransform.inverted() * newTransform;
|
||||
return getScale(localTransform);
|
||||
}
|
||||
|
||||
return startScale;
|
||||
}
|
||||
|
||||
QVector3D MouseArea3D::getMousePosInPlane(const QPointF &mousePosInView) const
|
||||
{
|
||||
const QVector3D mousePos1(float(mousePosInView.x()), float(mousePosInView.y()), 0);
|
||||
@@ -207,8 +295,8 @@ QVector3D MouseArea3D::getMousePosInPlane(const QPointF &mousePosInView) const
|
||||
|
||||
bool MouseArea3D::eventFilter(QObject *, QEvent *event)
|
||||
{
|
||||
if (m_grabsMouse && s_mouseGrab && s_mouseGrab != this
|
||||
&& (m_priority <= s_mouseGrab->m_priority || s_mouseGrab->m_dragging)) {
|
||||
if (!m_active || (m_grabsMouse && s_mouseGrab && s_mouseGrab != this
|
||||
&& (m_priority <= s_mouseGrab->m_priority || s_mouseGrab->m_dragging))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -227,7 +315,7 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event)
|
||||
m_mousePosInPlane = getMousePosInPlane(mouseEvent->pos());
|
||||
if (mouseOnTopOfMouseArea(m_mousePosInPlane)) {
|
||||
setDragging(true);
|
||||
emit pressed(m_mousePosInPlane);
|
||||
emit pressed(m_mousePosInPlane, mouseEvent->globalPos());
|
||||
if (m_grabsMouse) {
|
||||
if (s_mouseGrab && s_mouseGrab != this) {
|
||||
s_mouseGrab->setDragging(false);
|
||||
@@ -250,7 +338,7 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event)
|
||||
if (qFuzzyCompare(mousePosInPlane.z(), -1))
|
||||
mousePosInPlane = m_mousePosInPlane;
|
||||
setDragging(false);
|
||||
emit released(mousePosInPlane);
|
||||
emit released(mousePosInPlane, mouseEvent->globalPos());
|
||||
if (m_grabsMouse) {
|
||||
if (s_mouseGrab && s_mouseGrab != this) {
|
||||
s_mouseGrab->setDragging(false);
|
||||
@@ -290,7 +378,7 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event)
|
||||
|
||||
if (m_dragging && !qFuzzyCompare(mousePosInPlane.z(), -1)) {
|
||||
m_mousePosInPlane = mousePosInPlane;
|
||||
emit dragged(mousePosInPlane);
|
||||
emit dragged(mousePosInPlane, mouseEvent->globalPos());
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
@@ -49,6 +49,7 @@ class MouseArea3D : public QQuick3DNode
|
||||
Q_PROPERTY(bool hovering READ hovering NOTIFY hoveringChanged)
|
||||
Q_PROPERTY(bool dragging READ dragging NOTIFY draggingChanged)
|
||||
Q_PROPERTY(int priority READ priority WRITE setPriority NOTIFY priorityChanged)
|
||||
Q_PROPERTY(int active READ active WRITE setActive NOTIFY activeChanged)
|
||||
|
||||
Q_INTERFACES(QQmlParserStatus)
|
||||
|
||||
@@ -66,10 +67,12 @@ public:
|
||||
bool hovering() const;
|
||||
bool dragging() const;
|
||||
bool grabsMouse() const;
|
||||
bool active() const;
|
||||
|
||||
public slots:
|
||||
void setView3D(QQuick3DViewport *view3D);
|
||||
void setGrabsMouse(bool grabsMouse);
|
||||
void setActive(bool active);
|
||||
|
||||
void setX(qreal x);
|
||||
void setY(qreal y);
|
||||
@@ -82,6 +85,10 @@ public slots:
|
||||
const QVector3D &planePos,
|
||||
const QVector3D &planeNormal) const;
|
||||
|
||||
Q_INVOKABLE QVector3D getNewScale(QQuick3DNode *node, const QVector3D &startScale,
|
||||
const QVector3D &pressPos,
|
||||
const QVector3D &sceneRelativeDistance, bool global);
|
||||
|
||||
signals:
|
||||
void view3DChanged();
|
||||
|
||||
@@ -93,9 +100,10 @@ signals:
|
||||
|
||||
void hoveringChanged();
|
||||
void draggingChanged();
|
||||
void pressed(const QVector3D &pointerPosition);
|
||||
void released(const QVector3D &pointerPosition);
|
||||
void dragged(const QVector3D &pointerPosition);
|
||||
void activeChanged(bool active);
|
||||
void pressed(const QVector3D &scenePos, const QPoint &screenPos);
|
||||
void released(const QVector3D &scenePos, const QPoint &screenPos);
|
||||
void dragged(const QVector3D &scenePos, const QPoint &screenPos);
|
||||
void grabsMouseChanged(bool grabsMouse);
|
||||
|
||||
protected:
|
||||
@@ -118,6 +126,7 @@ private:
|
||||
|
||||
bool m_hovering = false;
|
||||
bool m_dragging = false;
|
||||
bool m_active = false;
|
||||
|
||||
QVector3D getMousePosInPlane(const QPointF &mousePosInView) const;
|
||||
|
||||
|
||||
@@ -61,6 +61,7 @@
|
||||
#include "dummycontextobject.h"
|
||||
#include "../editor3d/cameracontrolhelper.h"
|
||||
#include "../editor3d/mousearea3d.h"
|
||||
#include "../editor3d/camerageometry.h"
|
||||
|
||||
#include <designersupportdelegate.h>
|
||||
|
||||
@@ -85,6 +86,7 @@ QObject *Qt5InformationNodeInstanceServer::createEditView3D(QQmlEngine *engine)
|
||||
|
||||
#ifdef QUICK3D_MODULE
|
||||
qmlRegisterType<QmlDesigner::Internal::MouseArea3D>("MouseArea3D", 1, 0, "MouseArea3D");
|
||||
qmlRegisterType<QmlDesigner::Internal::CameraGeometry>("CameraGeometry", 1, 0, "CameraGeometry");
|
||||
#endif
|
||||
|
||||
QQmlComponent component(engine, QUrl("qrc:/qtquickplugin/mockfiles/EditView3D.qml"));
|
||||
@@ -97,12 +99,12 @@ QObject *Qt5InformationNodeInstanceServer::createEditView3D(QQmlEngine *engine)
|
||||
}
|
||||
|
||||
QObject::connect(window, SIGNAL(objectClicked(QVariant)), this, SLOT(objectClicked(QVariant)));
|
||||
QObject::connect(window, SIGNAL(commitObjectPosition(QVariant)),
|
||||
this, SLOT(handleObjectPositionCommit(QVariant)));
|
||||
QObject::connect(window, SIGNAL(moveObjectPosition(QVariant)),
|
||||
this, SLOT(handleObjectPositionMove(QVariant)));
|
||||
QObject::connect(&m_moveTimer, &QTimer::timeout,
|
||||
this, &Qt5InformationNodeInstanceServer::handleObjectPositionMoveTimeout);
|
||||
QObject::connect(window, SIGNAL(commitObjectProperty(QVariant, QVariant)),
|
||||
this, SLOT(handleObjectPropertyCommit(QVariant, QVariant)));
|
||||
QObject::connect(window, SIGNAL(changeObjectProperty(QVariant, QVariant)),
|
||||
this, SLOT(handleObjectPropertyChange(QVariant, QVariant)));
|
||||
QObject::connect(&m_propertyChangeTimer, &QTimer::timeout,
|
||||
this, &Qt5InformationNodeInstanceServer::handleObjectPropertyChangeTimeout);
|
||||
|
||||
//For macOS we have to use the 4.1 core profile
|
||||
QSurfaceFormat surfaceFormat = window->requestedFormat();
|
||||
@@ -188,28 +190,44 @@ void Qt5InformationNodeInstanceServer::modifyVariantValue(
|
||||
}
|
||||
}
|
||||
|
||||
void Qt5InformationNodeInstanceServer::handleObjectPositionCommit(const QVariant &object)
|
||||
void Qt5InformationNodeInstanceServer::handleObjectPropertyCommit(const QVariant &object,
|
||||
const QVariant &propName)
|
||||
{
|
||||
modifyVariantValue(object, "position", ValuesModifiedCommand::TransactionOption::End);
|
||||
m_movedNode = {};
|
||||
m_moveTimer.stop();
|
||||
modifyVariantValue(object, propName.toByteArray(),
|
||||
ValuesModifiedCommand::TransactionOption::End);
|
||||
m_changedNode = {};
|
||||
m_changedProperty = {};
|
||||
m_propertyChangeTimer.stop();
|
||||
}
|
||||
|
||||
void Qt5InformationNodeInstanceServer::handleObjectPositionMove(const QVariant &object)
|
||||
void Qt5InformationNodeInstanceServer::handleObjectPropertyChange(const QVariant &object,
|
||||
const QVariant &propName)
|
||||
{
|
||||
if (m_movedNode.isNull()) {
|
||||
modifyVariantValue(object, "position", ValuesModifiedCommand::TransactionOption::Start);
|
||||
} else {
|
||||
if (!m_moveTimer.isActive())
|
||||
m_moveTimer.start();
|
||||
PropertyName propertyName(propName.toByteArray());
|
||||
if (m_changedProperty != propertyName || m_changedNode != object) {
|
||||
if (!m_changedNode.isNull())
|
||||
handleObjectPropertyCommit(m_changedNode, m_changedProperty);
|
||||
modifyVariantValue(object, propertyName,
|
||||
ValuesModifiedCommand::TransactionOption::Start);
|
||||
} else if (!m_propertyChangeTimer.isActive()) {
|
||||
m_propertyChangeTimer.start();
|
||||
}
|
||||
m_movedNode = object;
|
||||
m_changedNode = object;
|
||||
m_changedProperty = propertyName;
|
||||
}
|
||||
|
||||
void Qt5InformationNodeInstanceServer::updateViewPortRect()
|
||||
{
|
||||
QRectF viewPortrect(0, 0, m_viewPortInstance.internalObject()->property("width").toDouble(),
|
||||
m_viewPortInstance.internalObject()->property("height").toDouble());
|
||||
QQmlProperty viewPortProperty(m_editView3D, "viewPortRect", context());
|
||||
viewPortProperty.write(viewPortrect);
|
||||
}
|
||||
|
||||
Qt5InformationNodeInstanceServer::Qt5InformationNodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient) :
|
||||
Qt5NodeInstanceServer(nodeInstanceClient)
|
||||
{
|
||||
m_moveTimer.setInterval(100);
|
||||
m_propertyChangeTimer.setInterval(100);
|
||||
}
|
||||
|
||||
void Qt5InformationNodeInstanceServer::sendTokenBack()
|
||||
@@ -282,9 +300,10 @@ void Qt5InformationNodeInstanceServer::modifyProperties(
|
||||
nodeInstanceClient()->valuesModified(createValuesModifiedCommand(properties));
|
||||
}
|
||||
|
||||
void Qt5InformationNodeInstanceServer::handleObjectPositionMoveTimeout()
|
||||
void Qt5InformationNodeInstanceServer::handleObjectPropertyChangeTimeout()
|
||||
{
|
||||
modifyVariantValue(m_movedNode, "position", ValuesModifiedCommand::TransactionOption::None);
|
||||
modifyVariantValue(m_changedNode, m_changedProperty,
|
||||
ValuesModifiedCommand::TransactionOption::None);
|
||||
}
|
||||
|
||||
QObject *Qt5InformationNodeInstanceServer::findRootNodeOf3DViewport(
|
||||
@@ -307,7 +326,6 @@ void Qt5InformationNodeInstanceServer::findCamerasAndLights(
|
||||
const QList<ServerNodeInstance> &instanceList,
|
||||
QObjectList &cameras, QObjectList &lights) const
|
||||
{
|
||||
QObjectList objList;
|
||||
for (const ServerNodeInstance &instance : instanceList) {
|
||||
if (instance.isSubclassOf("QQuick3DCamera"))
|
||||
cameras << instance.internalObject();
|
||||
@@ -316,6 +334,16 @@ void Qt5InformationNodeInstanceServer::findCamerasAndLights(
|
||||
}
|
||||
}
|
||||
|
||||
ServerNodeInstance Qt5InformationNodeInstanceServer::findViewPort(
|
||||
const QList<ServerNodeInstance> &instanceList)
|
||||
{
|
||||
for (const ServerNodeInstance &instance : instanceList) {
|
||||
if (instance.isSubclassOf("QQuick3DViewport"))
|
||||
return instance;
|
||||
}
|
||||
return ServerNodeInstance();
|
||||
}
|
||||
|
||||
void Qt5InformationNodeInstanceServer::setup3DEditView(const QList<ServerNodeInstance> &instanceList)
|
||||
{
|
||||
ServerNodeInstance root = rootNodeInstance();
|
||||
@@ -341,8 +369,17 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(const QList<ServerNodeIns
|
||||
sceneProperty.write(objectToVariant(node));
|
||||
QQmlProperty parentProperty(node, "parent", context());
|
||||
parentProperty.write(objectToVariant(m_editView3D));
|
||||
QQmlProperty completeSceneProperty(m_editView3D, "showLight", context());
|
||||
completeSceneProperty.write(showCustomLight);
|
||||
QQmlProperty showLightProperty(m_editView3D, "showLight", context());
|
||||
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
|
||||
QObjectList cameras;
|
||||
|
||||
@@ -51,8 +51,9 @@ public:
|
||||
|
||||
private slots:
|
||||
void objectClicked(const QVariant &object);
|
||||
void handleObjectPositionCommit(const QVariant &object);
|
||||
void handleObjectPositionMove(const QVariant &object);
|
||||
void handleObjectPropertyCommit(const QVariant &object, const QVariant &propName);
|
||||
void handleObjectPropertyChange(const QVariant &object, const QVariant &propName);
|
||||
void updateViewPortRect();
|
||||
|
||||
protected:
|
||||
void collectItemChangesAndSendChangeCommands() override;
|
||||
@@ -64,12 +65,13 @@ protected:
|
||||
void modifyProperties(const QVector<InstancePropertyValueTriple> &properties);
|
||||
|
||||
private:
|
||||
void handleObjectPositionMoveTimeout();
|
||||
void handleObjectPropertyChangeTimeout();
|
||||
QObject *createEditView3D(QQmlEngine *engine);
|
||||
void setup3DEditView(const QList<ServerNodeInstance> &instanceList);
|
||||
QObject *findRootNodeOf3DViewport(const QList<ServerNodeInstance> &instanceList) const;
|
||||
void findCamerasAndLights( const QList<ServerNodeInstance> &instanceList,
|
||||
QObjectList &cameras, QObjectList &lights) const;
|
||||
ServerNodeInstance findViewPort(const QList<ServerNodeInstance> &instanceList);
|
||||
QVector<InstancePropertyValueTriple> vectorToPropertyValue(const ServerNodeInstance &instance,
|
||||
const PropertyName &propertyName,
|
||||
const QVariant &variant);
|
||||
@@ -81,8 +83,10 @@ private:
|
||||
QSet<ServerNodeInstance> m_parentChangedSet;
|
||||
QList<ServerNodeInstance> m_completedComponentList;
|
||||
QList<TokenCommand> m_tokenList;
|
||||
QTimer m_moveTimer;
|
||||
QVariant m_movedNode;
|
||||
QTimer m_propertyChangeTimer;
|
||||
QVariant m_changedNode;
|
||||
PropertyName m_changedProperty;
|
||||
ServerNodeInstance m_viewPortInstance;
|
||||
};
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
@@ -15,7 +15,14 @@
|
||||
<file>mockfiles/LightGizmo.qml</file>
|
||||
<file>mockfiles/IconGizmo.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/scalerod.mesh</file>
|
||||
<file>mockfiles/images/camera-pick-icon.png</file>
|
||||
<file>mockfiles/images/camera-pick-icon@2x.png</file>
|
||||
<file>mockfiles/images/light-pick-icon.png</file>
|
||||
|
||||
@@ -44,6 +44,8 @@ T.ComboBox {
|
||||
property real __actionIndicatorWidth: StudioTheme.Values.squareComponentWidth
|
||||
property real __actionIndicatorHeight: StudioTheme.Values.height
|
||||
|
||||
property alias textInput: comboBoxInput
|
||||
|
||||
signal compressedActivated(int index)
|
||||
|
||||
width: StudioTheme.Values.squareComponentWidth * 5
|
||||
|
||||
@@ -54,10 +54,10 @@ while read -r line; do
|
||||
done < <(env)
|
||||
'''
|
||||
|
||||
def system_login_script():
|
||||
def system_login_script_bash():
|
||||
return 'if [ -f /etc/profile ]; then source /etc/profile; fi\n'
|
||||
|
||||
def login_script():
|
||||
def login_script_bash():
|
||||
return '''
|
||||
if [ -f $HOME/.bash_profile ]; then
|
||||
source $HOME/.bash_profile
|
||||
@@ -68,6 +68,16 @@ elif [ -f $HOME/.profile ]; then
|
||||
fi
|
||||
'''
|
||||
|
||||
def system_login_script_zsh():
|
||||
return '[ -r /etc/profile ] && source /etc/profile\n'
|
||||
|
||||
def login_script_zsh():
|
||||
return '''
|
||||
[ -r $HOME/.zprofile ] && source $HOME/.zprofile
|
||||
[ -r $HOME/.zshrc ] && source $HOME/.zshrc
|
||||
[ -r $HOME/.zlogin ] && source $HOME/.zlogin
|
||||
'''
|
||||
|
||||
def environment_script():
|
||||
return ''.join(['export ' + quote_shell(key + '=' + os.environ[key]) + '\n'
|
||||
for key in os.environ])
|
||||
@@ -98,6 +108,10 @@ end tell
|
||||
def main():
|
||||
# create temporary file to be sourced into bash that deletes itself
|
||||
with NamedTemporaryFile(delete=False) as shell_script:
|
||||
shell = os.environ.get('SHELL')
|
||||
shell_is_zsh = shell is not None and shell.endswith('/zsh')
|
||||
system_login_script = system_login_script_zsh if shell_is_zsh else system_login_script_bash
|
||||
login_script = login_script_zsh if shell_is_zsh else login_script_bash
|
||||
quoted_shell_script = quote_shell(shell_script.name)
|
||||
commands = (clean_environment_script() +
|
||||
system_login_script() + # /etc/profile by default resets the path, so do first
|
||||
@@ -106,7 +120,7 @@ def main():
|
||||
'cd ' + quote_shell(os.getcwd()) + '\n' +
|
||||
' '.join([quote_shell(arg) for arg in sys.argv[1:]]) + '\n' +
|
||||
'rm ' + quoted_shell_script + '\n' +
|
||||
'exit\n' if len(sys.argv) > 1 else ''
|
||||
('exit\n' if len(sys.argv) > 1 else '')
|
||||
)
|
||||
shell_script.write(commands)
|
||||
shell_script.flush()
|
||||
|
||||
2
src/libs/3rdparty/cplusplus/AST.h
vendored
2
src/libs/3rdparty/cplusplus/AST.h
vendored
@@ -2415,7 +2415,7 @@ class CPLUSPLUS_EXPORT AlignofExpressionAST: public ExpressionAST
|
||||
public:
|
||||
int alignof_token = 0;
|
||||
int lparen_token = 0;
|
||||
TypeIdAST *typeId;
|
||||
TypeIdAST *typeId = nullptr;
|
||||
int rparen_token = 0;
|
||||
|
||||
public:
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
Copyright 2004 Alexander Neundorf (neundorf@kde.org)
|
||||
Copyright 2005 Dominik Haumann (dhdev@gmx.de)
|
||||
Copyright 2007,2008,2013,2014 Matthew Woehlke (mw_triad@users.sourceforge.net)
|
||||
Copyright 2013-2015,2017-2018 Alex Turbov (i.zaufi@gmail.com)
|
||||
Copyright 2013-2015,2017-2019 Alex Turbov (i.zaufi@gmail.com)
|
||||
|
||||
**********************************************************************
|
||||
* This library is free software; you can redistribute it and/or *
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
<language
|
||||
name="CMake"
|
||||
version="11"
|
||||
version="16"
|
||||
kateversion="2.4"
|
||||
section="Other"
|
||||
extensions="CMakeLists.txt;*.cmake;*.cmake.in"
|
||||
@@ -70,6 +70,12 @@
|
||||
{%- endfor %}
|
||||
</list>
|
||||
|
||||
<list name="environment-variables">
|
||||
{%- for var in environment_variables.kw %}
|
||||
<item>{{var}}</item>
|
||||
{%- endfor %}
|
||||
</list>
|
||||
|
||||
{%- for kind in properties.kinds %}
|
||||
<list name="{{ kind|replace('_', '-') }}">
|
||||
{%- for prop in properties[kind].kw %}
|
||||
@@ -197,11 +203,27 @@
|
||||
</context>
|
||||
|
||||
<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="{" />
|
||||
<RegExpr attribute="@Variable Substitution" context="@VarSubst" String="@&id_re;@" lookAhead="true" />
|
||||
</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">
|
||||
<IncludeRules context="Detect Builtin Variables" />
|
||||
<DetectIdentifier />
|
||||
@@ -300,10 +322,12 @@
|
||||
<itemData name="Strings" defStyleNum="dsString" spellChecking="true" />
|
||||
<itemData name="Escapes" defStyleNum="dsChar" 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="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="Standard Environment Variable" defStyleNum="dsFloat" 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="Comment" defStyleNum="dsComment" spellChecking="true" />
|
||||
|
||||
@@ -7,6 +7,7 @@ global-properties:
|
||||
- AUTORCC_SOURCE_GROUP
|
||||
- CMAKE_C_KNOWN_FEATURES
|
||||
- CMAKE_CXX_KNOWN_FEATURES
|
||||
- CMAKE_ROLE # Since 3.14
|
||||
- DEBUG_CONFIGURATIONS
|
||||
- DISABLED_FEATURES
|
||||
- ENABLED_FEATURES
|
||||
@@ -42,6 +43,7 @@ global-properties:
|
||||
- FeatureSummary_<TYPE>_DESCRIPTION
|
||||
|
||||
directory-properties:
|
||||
- ADDITIONAL_CLEAN_FILES # Since 3.15
|
||||
- ADDITIONAL_MAKE_CLEAN_FILES
|
||||
- BINARY_DIR
|
||||
- BUILDSYSTEM_TARGETS
|
||||
@@ -78,6 +80,7 @@ directory-properties:
|
||||
|
||||
# NOTE Copy-n-pasting this list from official docs may contain a redudant item `Example`! Check it!
|
||||
target-properties:
|
||||
- ADDITIONAL_CLEAN_FILES # Since 3.15
|
||||
- ALIASED_TARGET
|
||||
- ANDROID_ANT_ADDITIONAL_OPTIONS
|
||||
- ANDROID_API
|
||||
@@ -101,17 +104,24 @@ target-properties:
|
||||
- ARCHIVE_OUTPUT_NAME_<CONFIG>
|
||||
- ARCHIVE_OUTPUT_NAME
|
||||
- AUTOGEN_BUILD_DIR
|
||||
- AUTOGEN_ORIGIN_DEPENDS # Since 3.14
|
||||
- AUTOGEN_TARGET_DEPENDS
|
||||
- AUTOMOC_COMPILER_PREDEFINES # Since ???
|
||||
- AUTOMOC_DEPEND_FILTERS
|
||||
- AUTOMOC_MOC_OPTIONS
|
||||
- AUTOMOC_EXECUTABLE # Since 3.14
|
||||
- AUTOMOC_MACRO_NAMES
|
||||
- AUTOMOC_MOC_OPTIONS # Since ???
|
||||
- AUTOMOC
|
||||
- AUTOUIC
|
||||
- AUTOUIC_EXECUTABLE # Since 3.14
|
||||
- AUTOUIC_OPTIONS
|
||||
- AUTOUIC_SEARCH_PATHS
|
||||
- AUTORCC
|
||||
- AUTORCC_EXECUTABLE # Since 3.14
|
||||
- AUTORCC_OPTIONS
|
||||
- BINARY_DIR
|
||||
- BUILD_RPATH
|
||||
- BUILD_RPATH_USE_ORIGIN # Since 3.14
|
||||
- BUILD_WITH_INSTALL_NAME_DIR
|
||||
- BUILD_WITH_INSTALL_RPATH
|
||||
- BUNDLE_EXTENSION
|
||||
@@ -246,6 +256,7 @@ target-properties:
|
||||
- MACOSX_RPATH
|
||||
- MANUALLY_ADDED_DEPENDENCIES
|
||||
- MAP_IMPORTED_CONFIG_<CONFIG>
|
||||
- MSVC_RUNTIME_LIBRARY # Since 3.15
|
||||
- NAME
|
||||
- NO_SONAME
|
||||
- NO_SYSTEM_FROM_IMPORTED
|
||||
@@ -278,6 +289,9 @@ target-properties:
|
||||
- STATIC_LIBRARY_FLAGS
|
||||
- STATIC_LIBRARY_OPTIONS # Since 3.13
|
||||
- SUFFIX
|
||||
- Swift_DEPENDENCIES_FILE # Since 3.15
|
||||
- Swift_MODULE_DIRECTORY # Since 3.15
|
||||
- Swift_MODULE_NAME # Since 3.15
|
||||
- TYPE
|
||||
- VERSION
|
||||
- VISIBILITY_INLINES_HIDDEN
|
||||
@@ -298,8 +312,13 @@ target-properties:
|
||||
- VS_GLOBAL_<variable>
|
||||
- VS_IOT_EXTENSIONS_VERSION
|
||||
- VS_IOT_STARTUP_TASK
|
||||
- VS_JUST_MY_CODE_DEBUGGING # Since 3.15
|
||||
- VS_KEYWORD
|
||||
- VS_MOBILE_EXTENSIONS_VERSION
|
||||
- VS_NO_SOLUTION_DEPLOY # Since 3.15
|
||||
- VS_PACKAGE_REFERENCES # Since 3.15
|
||||
- VS_PROJECT_IMPORT # Since 3.15
|
||||
- VS_PACKAGE_REFERENCES
|
||||
- VS_SCC_AUXPATH
|
||||
- VS_SCC_LOCALPATH
|
||||
- VS_SCC_PROJECTNAME
|
||||
@@ -314,9 +333,12 @@ target-properties:
|
||||
- WINDOWS_EXPORT_ALL_SYMBOLS
|
||||
- XCODE_ATTRIBUTE_<an-attribute>
|
||||
- XCODE_EXPLICIT_FILE_TYPE
|
||||
- XCODE_GENERATE_SCHEME # Since 3.15
|
||||
- XCODE_PRODUCT_TYPE
|
||||
- XCODE_SCHEME_ADDRESS_SANITIZER # Since 3.13
|
||||
- XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN # Since 3.13
|
||||
- XCODE_SCHEME_ARGUMENTS # Since 3.13
|
||||
- XCODE_SCHEME_DEBUG_AS_ROOT # Since 3.15
|
||||
- XCODE_SCHEME_THREAD_SANITIZER # Since 3.13
|
||||
- XCODE_SCHEME_THREAD_SANITIZER_STOP # Since 3.13
|
||||
- XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER # Since 3.13
|
||||
@@ -331,7 +353,6 @@ target-properties:
|
||||
- XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE # Since 3.13
|
||||
- XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS # Since 3.13
|
||||
- XCODE_SCHEME_EXECUTABLE # Since 3.13
|
||||
- XCODE_SCHEME_ARGUMENTS # Since 3.13
|
||||
- XCODE_SCHEME_ENVIRONMENT # Since 3.13
|
||||
- XCTEST
|
||||
|
||||
@@ -383,6 +404,8 @@ source-properties:
|
||||
- SKIP_AUTOMOC
|
||||
- SKIP_AUTORCC
|
||||
- SKIP_AUTOUIC
|
||||
- Swift_DEPENDENCIES_FILE # Since 3.15
|
||||
- Swift_DIAGNOSTICS_FILE # Since 3.15
|
||||
- SYMBOLIC
|
||||
- VS_COPY_TO_OUT_DIR
|
||||
- VS_CSHARP_<tagname>
|
||||
@@ -423,69 +446,95 @@ install-properties:
|
||||
- CPACK_WIX_ACL
|
||||
|
||||
generator-expressions:
|
||||
# Boolean Generator Expressions
|
||||
# * Logical Operators
|
||||
- 0
|
||||
- 1
|
||||
- AND
|
||||
- ANGLE-R
|
||||
- BOOL
|
||||
- BUILD_INTERFACE
|
||||
- COMMA
|
||||
- COMPILE_FEATURES
|
||||
- COMPILE_LANGUAGE
|
||||
- CONFIG
|
||||
- CXX_COMPILER_ID
|
||||
- CXX_COMPILER_VERSION
|
||||
- C_COMPILER_ID
|
||||
- C_COMPILER_VERSION
|
||||
- EQUAL
|
||||
- GENEX_EVAL # Since 3.12
|
||||
- IF
|
||||
- INSTALL_INTERFACE
|
||||
- INSTALL_PREFIX
|
||||
- IN_LIST # Since 3.12
|
||||
- JOIN
|
||||
- LINK_ONLY
|
||||
- LOWER_CASE
|
||||
- MAKE_C_IDENTIFIER
|
||||
- NOT
|
||||
- AND
|
||||
- OR
|
||||
- PLATFORM_ID
|
||||
- SEMICOLON
|
||||
- SHELL_PATH
|
||||
- NOT
|
||||
# * String Comparisons
|
||||
- STREQUAL
|
||||
- TARGET_BUNDLE_CONTENT_DIR
|
||||
- TARGET_BUNDLE_DIR
|
||||
- TARGET_EXISTS # Since 3.12
|
||||
- TARGET_FILE
|
||||
- TARGET_FILE_DIR
|
||||
- TARGET_FILE_NAME
|
||||
- TARGET_GENEX_EVAL # Since 3.12
|
||||
- TARGET_LINKER_FILE
|
||||
- TARGET_LINKER_FILE_DIR
|
||||
- TARGET_LINKER_FILE_NAME
|
||||
- TARGET_NAME
|
||||
- TARGET_NAME_IF_EXISTS # Since 3.12
|
||||
- TARGET_OBJECTS
|
||||
- TARGET_PDB_FILE
|
||||
- TARGET_PDB_FILE_DIR
|
||||
- TARGET_PDB_FILE_NAME
|
||||
- TARGET_POLICY
|
||||
- TARGET_PROPERTY
|
||||
- TARGET_SONAME_FILE
|
||||
- TARGET_SONAME_FILE_DIR
|
||||
- TARGET_SONAME_FILE_NAME
|
||||
- UPPER_CASE
|
||||
- VERSION_EQUAL
|
||||
- VERSION_GREATER
|
||||
- VERSION_GREATER_EQUAL
|
||||
- EQUAL
|
||||
- IN_LIST # Since 3.12
|
||||
- VERSION_LESS
|
||||
- VERSION_GREATER
|
||||
- VERSION_EQUAL
|
||||
- VERSION_LESS_EQUAL
|
||||
- VERSION_GREATER_EQUAL
|
||||
# * Variable Queries
|
||||
- TARGET_EXISTS # Since 3.12
|
||||
- CONFIG
|
||||
- PLATFORM_ID
|
||||
- C_COMPILER_ID
|
||||
- CXX_COMPILER_ID
|
||||
- CUDA_COMPILER_ID # Since 3.15
|
||||
- Fortran_COMPILER_ID
|
||||
- C_COMPILER_VERSION
|
||||
- CXX_COMPILER_VERSION
|
||||
- CUDA_COMPILER_VERSION # Since 3.15
|
||||
- Fortran_COMPILER_VERSION
|
||||
- TARGET_POLICY
|
||||
- COMPILE_FEATURES
|
||||
- COMPILE_LANG_AND_ID # Since 3.15
|
||||
- COMPILE_LANGUAGE
|
||||
# String-Valued Generator Expressions
|
||||
# * Escaped Characters
|
||||
- ANGLE-R
|
||||
- COMMA
|
||||
- SEMICOLON
|
||||
# * Conditional Expressions
|
||||
- IF
|
||||
# * String Transformations
|
||||
- JOIN
|
||||
- REMOVE_DUPLICATES # Since 3.15
|
||||
- FILTER # Since 3.15
|
||||
- LOWER_CASE
|
||||
- UPPER_CASE
|
||||
- GENEX_EVAL # Since 3.12
|
||||
- TARGET_GENEX_EVAL # Since 3.12
|
||||
# * Variable Queries (NOTE Already included above)
|
||||
# * Target-Dependent Queries
|
||||
- TARGET_NAME_IF_EXISTS # Since 3.12
|
||||
- TARGET_FILE
|
||||
- TARGET_FILE_BASE_NAME # Since 3.15
|
||||
- TARGET_FILE_PREFIX # Since 3.15
|
||||
- TARGET_FILE_SUFFIX # Since 3.15
|
||||
- TARGET_FILE_NAME
|
||||
- TARGET_FILE_DIR
|
||||
- TARGET_LINKER_FILE
|
||||
- TARGET_LINKER_FILE_BASE_NAME # Since 3.15
|
||||
- TARGET_LINKER_FILE_PREFIX # Since 3.15
|
||||
- TARGET_LINKER_FILE_SUFFIX # Since 3.15
|
||||
- TARGET_LINKER_FILE_NAME
|
||||
- TARGET_LINKER_FILE_DIR
|
||||
- TARGET_SONAME_FILE
|
||||
- TARGET_SONAME_FILE
|
||||
- TARGET_SONAME_FILE_NAME
|
||||
- TARGET_SONAME_FILE_DIR
|
||||
- TARGET_PDB_FILE
|
||||
- TARGET_PDB_FILE_BASE_NAME # Since 3.15
|
||||
- TARGET_PDB_FILE_NAME
|
||||
- TARGET_PDB_FILE_DIR
|
||||
- TARGET_BUNDLE_DIR
|
||||
- TARGET_BUNDLE_CONTENT_DIR
|
||||
- TARGET_PROPERTY
|
||||
- INSTALL_PREFIX
|
||||
# Output-Related Expressions
|
||||
- TARGET_NAME
|
||||
- LINK_ONLY
|
||||
- INSTALL_INTERFACE
|
||||
- BUILD_INTERFACE
|
||||
- MAKE_C_IDENTIFIER
|
||||
- TARGET_OBJECTS
|
||||
- SHELL_PATH
|
||||
|
||||
variables:
|
||||
# Variables that Provide Information
|
||||
- CMAKE_AR
|
||||
- CMAKE_ARGC
|
||||
- CMAKE_ARGV0
|
||||
- CMAKE_ARGV<n>
|
||||
- CMAKE_BINARY_DIR
|
||||
- CMAKE_BUILD_TOOL
|
||||
- CMAKE_CACHEFILE_DIR
|
||||
@@ -558,6 +607,7 @@ variables:
|
||||
- CMAKE_SOURCE_DIR
|
||||
- CMAKE_STATIC_LIBRARY_PREFIX
|
||||
- CMAKE_STATIC_LIBRARY_SUFFIX
|
||||
- CMAKE_Swift_MODULE_DIRECTORY # Since 3.15
|
||||
- CMAKE_TOOLCHAIN_FILE
|
||||
- CMAKE_TWEAK_VERSION
|
||||
- CMAKE_VERBOSE_MAKEFILE
|
||||
@@ -611,7 +661,9 @@ variables:
|
||||
- CMAKE_ECLIPSE_VERSION
|
||||
- CMAKE_ERROR_DEPRECATED
|
||||
- CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION
|
||||
- CMAKE_EXECUTE_PROCESS_COMMAND_ECHO # Since 3.15
|
||||
- CMAKE_EXPORT_COMPILE_COMMANDS
|
||||
- CMAKE_EXPORT_PACKAGE_REGISTRY # Since 3.15
|
||||
- CMAKE_EXPORT_NO_PACKAGE_REGISTRY
|
||||
- CMAKE_FIND_APPBUNDLE
|
||||
- CMAKE_FIND_FRAMEWORK
|
||||
@@ -621,6 +673,8 @@ variables:
|
||||
- CMAKE_FIND_NO_INSTALL_PREFIX
|
||||
- CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY
|
||||
- CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY
|
||||
- CMAKE_FIND_PACKAGE_PREFER_CONFIG # Since 3.15
|
||||
- CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS # Since 3.14
|
||||
- CMAKE_FIND_PACKAGE_WARN_NO_MODULE
|
||||
- CMAKE_FIND_ROOT_PATH
|
||||
- CMAKE_FIND_ROOT_PATH_MODE_INCLUDE
|
||||
@@ -639,6 +693,7 @@ variables:
|
||||
- CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT
|
||||
- CMAKE_LIBRARY_PATH
|
||||
- CMAKE_LINK_DIRECTORIES_BEFORE # Since 3.13
|
||||
- CMAKE_MAXIMUM_RECURSION_DEPTH # Since 3.14
|
||||
- CMAKE_MFC_FLAG
|
||||
- CMAKE_MODULE_PATH
|
||||
- CMAKE_NOT_USING_CONFIG_FLAGS
|
||||
@@ -646,6 +701,8 @@ variables:
|
||||
- CMAKE_POLICY_WARNING_CMP<NNNN>
|
||||
- CMAKE_PREFIX_PATH
|
||||
- CMAKE_PROGRAM_PATH
|
||||
- CMAKE_PROJECT_INCLUDE # Since 3.15
|
||||
- CMAKE_PROJECT_INCLUDE_BEFORE # Since 3.15
|
||||
- CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE
|
||||
- CMAKE_SKIP_INSTALL_ALL_DEPENDENCY
|
||||
- CMAKE_STAGING_PREFIX
|
||||
@@ -757,6 +814,7 @@ variables:
|
||||
- CMAKE_ANDROID_STL_TYPE
|
||||
- CMAKE_ARCHIVE_OUTPUT_DIRECTORY
|
||||
- CMAKE_ARCHIVE_OUTPUT_DIRECTORY_<CONFIG>
|
||||
- CMAKE_AUTOGEN_ORIGIN_DEPENDS # Since 3.14
|
||||
- CMAKE_AUTOGEN_PARALLEL
|
||||
- CMAKE_AUTOGEN_VERBOSE # Since 3.13
|
||||
- CMAKE_AUTOMOC
|
||||
@@ -768,6 +826,7 @@ variables:
|
||||
- CMAKE_AUTOUIC_OPTIONS
|
||||
- CMAKE_AUTOUIC_SEARCH_PATHS
|
||||
- CMAKE_BUILD_RPATH
|
||||
- CMAKE_BUILD_RPATH_USE_ORIGIN # Since 3.14
|
||||
- CMAKE_BUILD_WITH_INSTALL_NAME_DIR
|
||||
- CMAKE_BUILD_WITH_INSTALL_RPATH
|
||||
- CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY
|
||||
@@ -781,8 +840,13 @@ variables:
|
||||
- CMAKE_EXE_LINKER_FLAGS_<CONFIG>_INIT
|
||||
- CMAKE_EXE_LINKER_FLAGS_INIT
|
||||
- CMAKE_FOLDER # Since 3.12
|
||||
- CMAKE_FRAMEWORK # Since 3.15
|
||||
- CMAKE_Fortran_FORMAT
|
||||
- CMAKE_Fortran_MODULE_DIRECTORY
|
||||
- CMAKE_GLOBAL_AUTOGEN_TARGET # Since 3.14
|
||||
- CMAKE_GLOBAL_AUTOGEN_TARGET_NAME # Since 3.14
|
||||
- CMAKE_GLOBAL_AUTORCC_TARGET # Since 3.14
|
||||
- CMAKE_GLOBAL_AUTORCC_TARGET_NAME # Since 3.14
|
||||
- CMAKE_GNUtoMS
|
||||
- CMAKE_INCLUDE_CURRENT_DIR
|
||||
- CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE
|
||||
@@ -814,6 +878,8 @@ variables:
|
||||
- CMAKE_MODULE_LINKER_FLAGS_<CONFIG>
|
||||
- CMAKE_MODULE_LINKER_FLAGS_<CONFIG>_INIT
|
||||
- CMAKE_MODULE_LINKER_FLAGS_INIT
|
||||
- CMAKE_MSVCIDE_RUN_PATH # Since 3.15
|
||||
- CMAKE_MSVC_RUNTIME_LIBRARY # Since 3.15
|
||||
- CMAKE_NINJA_OUTPUT_PATH_PREFIX
|
||||
- CMAKE_NO_BUILTIN_CHRPATH
|
||||
- CMAKE_NO_SYSTEM_FROM_IMPORTED
|
||||
@@ -843,6 +909,7 @@ variables:
|
||||
- CMAKE_VS_GLOBALS # Since 3.13
|
||||
- CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD
|
||||
- CMAKE_VS_INCLUDE_PACKAGE_TO_DEFAULT_BUILD
|
||||
- CMAKE_VS_JUST_MY_CODE_DEBUGGING # Since 3.15
|
||||
- CMAKE_VS_SDK_EXCLUDE_DIRECTORIES # Since 3.12
|
||||
- CMAKE_VS_SDK_EXECUTABLE_DIRECTORIES # Since 3.12
|
||||
- CMAKE_VS_SDK_INCLUDE_DIRECTORIES # Since 3.12
|
||||
@@ -986,6 +1053,7 @@ variables:
|
||||
- CTEST_P4_UPDATE_OPTIONS
|
||||
- CTEST_SCP_COMMAND
|
||||
- CTEST_SITE
|
||||
- CTEST_SUBMIT_URL # Since 3.14
|
||||
- CTEST_SOURCE_DIRECTORY
|
||||
- CTEST_SVN_COMMAND
|
||||
- CTEST_SVN_OPTIONS
|
||||
@@ -996,6 +1064,7 @@ variables:
|
||||
- CTEST_UPDATE_COMMAND
|
||||
- CTEST_UPDATE_OPTIONS
|
||||
- CTEST_UPDATE_VERSION_ONLY
|
||||
- CTEST_UPDATE_VERSION_OVERRIDE # Since 3.15
|
||||
- CTEST_USE_LAUNCHERS
|
||||
# Variables for CPack
|
||||
- CPACK_ABSOLUTE_DESTINATION_FILES
|
||||
@@ -1064,6 +1133,7 @@ variables:
|
||||
- CMAKE_REQUIRED_DEFINITIONS
|
||||
- CMAKE_REQUIRED_FLAGS
|
||||
- CMAKE_REQUIRED_INCLUDES
|
||||
- CMAKE_REQUIRED_LINK_OPTIONS # Since 3.14
|
||||
- CMAKE_REQUIRED_LIBRARIES
|
||||
- CMAKE_REQUIRED_QUIET
|
||||
# - CheckTypeSize
|
||||
@@ -1198,6 +1268,7 @@ variables:
|
||||
- CPACK_IFW_PACKAGE_BANNER
|
||||
- CPACK_IFW_PACKAGE_BACKGROUND
|
||||
- CPACK_IFW_PACKAGE_WIZARD_STYLE
|
||||
- CPACK_IFW_PACKAGE_STYLE_SHEET # Since 3.15
|
||||
- CPACK_IFW_PACKAGE_WIZARD_DEFAULT_WIDTH
|
||||
- CPACK_IFW_PACKAGE_WIZARD_DEFAULT_HEIGHT
|
||||
- CPACK_IFW_PACKAGE_TITLE_COLOR
|
||||
@@ -1546,7 +1617,59 @@ variables:
|
||||
# - UseSWIG
|
||||
- CMAKE_SWIG_FLAGS
|
||||
- CMAKE_SWIG_OUTDIR
|
||||
- SWIG_OUTFILE_DIR
|
||||
- SWIG_MODULE_<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:
|
||||
-
|
||||
@@ -1670,11 +1793,21 @@ scripting-commands:
|
||||
, ERROR_FILE
|
||||
, OUTPUT_QUIET
|
||||
, ERROR_QUIET
|
||||
, COMMAND_ECHO # Since 3.15
|
||||
, OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
, ERROR_STRIP_TRAILING_WHITESPACE
|
||||
, ENCODING
|
||||
]
|
||||
special-args: [NONE, AUTO, ANSI, OEM, UTF8]
|
||||
special-args: [
|
||||
NONE
|
||||
, AUTO
|
||||
, ANSI
|
||||
, OEM
|
||||
, UTF8
|
||||
, STDERR # Since 3.15: the value for `COMMAND_ECHO`
|
||||
, STDOUT # Since 3.15: the value for `COMMAND_ECHO`
|
||||
]
|
||||
nested-parentheses?: true
|
||||
-
|
||||
name: file
|
||||
named-args: [
|
||||
@@ -1746,6 +1879,7 @@ scripting-commands:
|
||||
, DIRECTORY_PERMISSIONS
|
||||
, NO_SOURCE_PERMISSIONS
|
||||
, USE_SOURCE_PERMISSIONS
|
||||
, FOLLOW_SYMLINK_CHAIN # Since 3.15
|
||||
, FILES_MATCHING
|
||||
, PATTERN
|
||||
, REGEX
|
||||
@@ -1760,6 +1894,9 @@ scripting-commands:
|
||||
# Sub-options of UPLOAD/DOWNLOAD since 3.11
|
||||
, NETRC
|
||||
, NETRC_FILE
|
||||
# New sub-options since 3.14
|
||||
, READ_SYMLINK
|
||||
, SIZE
|
||||
]
|
||||
special-args: [
|
||||
UTF-8
|
||||
@@ -1871,7 +2008,21 @@ scripting-commands:
|
||||
property-args: &get_directory_property [directory-properties]
|
||||
-
|
||||
name: get_filename_component
|
||||
named-args: [DIRECTORY, NAME, EXT, NAME_WE, PATH, CACHE, BASE_DIR, ABSOLUTE, REALPATH, PROGRAM, PROGRAM_ARGS]
|
||||
named-args: [
|
||||
DIRECTORY
|
||||
, NAME
|
||||
, EXT
|
||||
, NAME_WE
|
||||
, PATH
|
||||
, CACHE
|
||||
, BASE_DIR
|
||||
, ABSOLUTE
|
||||
, REALPATH
|
||||
, PROGRAM
|
||||
, PROGRAM_ARGS
|
||||
, LAST_EXT # Since 3.14
|
||||
, NAME_WLE # Since 3.14
|
||||
]
|
||||
-
|
||||
name: get_property
|
||||
named-args: [GLOBAL, DIRECTORY, TARGET, SOURCE, INSTALL, TEST, CACHE, VARIABLE, PROPERTY, SET, DEFINED, BRIEF_DOCS, FULL_DOCS]
|
||||
@@ -1933,6 +2084,10 @@ scripting-commands:
|
||||
, FOR
|
||||
# NOTE Another `REGEX` named arg has already added
|
||||
, OUTPUT_VARIABLE
|
||||
# Since 3.15
|
||||
# NOTE Another `PREPEND` named arg has already added
|
||||
, POP_FRONT
|
||||
, POP_BACK
|
||||
]
|
||||
# Since 3.13
|
||||
special-args: [STRING, FILE_BASENAME, SENSITIVE, INSENSITIVE, ASCENDING, DESCENDING]
|
||||
@@ -1951,7 +2106,19 @@ scripting-commands:
|
||||
special-args: [DECIMAL, HEXADECIMAL]
|
||||
-
|
||||
name: message
|
||||
named-args: [STATUS, WARNING, AUTHOR_WARNING, SEND_ERROR, FATAL_ERROR, DEPRECATION]
|
||||
named-args: [
|
||||
STATUS
|
||||
, WARNING
|
||||
, AUTHOR_WARNING
|
||||
, SEND_ERROR
|
||||
, FATAL_ERROR
|
||||
, DEPRECATION
|
||||
# Since 3.15
|
||||
, NOTICE
|
||||
, VERBOSE
|
||||
, DEBUG
|
||||
, TRACE
|
||||
]
|
||||
-
|
||||
name: option
|
||||
-
|
||||
@@ -1993,6 +2160,7 @@ scripting-commands:
|
||||
, SUBSTRING
|
||||
, STRIP
|
||||
, GENEX_STRIP
|
||||
, REPEAT # Since 3.15
|
||||
, COMPARE
|
||||
, LESS
|
||||
, GREATER
|
||||
@@ -2055,6 +2223,7 @@ project-commands:
|
||||
, WORKING_DIRECTORY
|
||||
, COMMENT
|
||||
, DEPFILE
|
||||
, JOB_POOL # Since 3.15
|
||||
, VERBATIM
|
||||
, APPEND
|
||||
, USES_TERMINAL
|
||||
@@ -2064,6 +2233,7 @@ project-commands:
|
||||
, PRE_LINK
|
||||
, POST_BUILD
|
||||
]
|
||||
nested-parentheses?: true
|
||||
-
|
||||
name: add_custom_target
|
||||
named-args: [
|
||||
@@ -2075,12 +2245,14 @@ project-commands:
|
||||
, WORKING_DIRECTORY
|
||||
, COMMENT
|
||||
, DEPFILE
|
||||
, JOB_POOL # Since 3.15
|
||||
, VERBATIM
|
||||
, APPEND
|
||||
, USES_TERMINAL
|
||||
, COMMAND_EXPAND_LISTS
|
||||
, SOURCES
|
||||
]
|
||||
nested-parentheses?: true
|
||||
-
|
||||
name: add_definitions
|
||||
-
|
||||
@@ -2099,6 +2271,7 @@ project-commands:
|
||||
-
|
||||
name: add_test
|
||||
named-args: [NAME, COMMAND, CONFIGURATIONS, WORKING_DIRECTORY]
|
||||
nested-parentheses?: true
|
||||
-
|
||||
name: aux_source_directory
|
||||
-
|
||||
@@ -2347,6 +2520,7 @@ project-commands:
|
||||
, SOURCES
|
||||
, COMPILE_DEFINITIONS
|
||||
, LINK_LIBRARIES
|
||||
, LINK_OPTIONS # Since 3.14
|
||||
, COPY_FILE
|
||||
, COPY_FILE_ERROR
|
||||
, <LANG>_STANDARD
|
||||
@@ -2361,6 +2535,7 @@ project-commands:
|
||||
, CMAKE_FLAGS
|
||||
, COMPILE_DEFINITIONS
|
||||
, LINK_LIBRARIES
|
||||
, LINK_OPTIONS # Since 3.14
|
||||
, COMPILE_OUTPUT_VARIABLE
|
||||
, RUN_OUTPUT_VARIABLE
|
||||
, OUTPUT_VARIABLE
|
||||
@@ -2414,7 +2589,19 @@ ctest-commands:
|
||||
named-args: [TRACK, APPEND, QUIET]
|
||||
-
|
||||
name: ctest_submit
|
||||
named-args: [PARTS, FILES, HTTPHEADER, RETRY_COUNT, RETRY_DELAY, RETURN_VALUE, QUIET, CDASH_UPLOAD, CDASH_UPLOAD_TYPE]
|
||||
named-args: [
|
||||
PARTS
|
||||
, FILES
|
||||
, BUILD_ID # Since 3.15
|
||||
, SUBMIT_URL # Since 3.14
|
||||
, HTTPHEADER
|
||||
, RETRY_COUNT
|
||||
, RETRY_DELAY
|
||||
, RETURN_VALUE
|
||||
, QUIET
|
||||
, CDASH_UPLOAD
|
||||
, CDASH_UPLOAD_TYPE
|
||||
]
|
||||
-
|
||||
name: ctest_test
|
||||
named-args: [
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# 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:
|
||||
#
|
||||
@@ -33,6 +33,7 @@ _PROPERTY_KEYS = [
|
||||
, 'install-properties'
|
||||
]
|
||||
_KW_RE_LIST = ['kw', 're']
|
||||
_VAR_KIND_LIST = ['variables', 'environment-variables']
|
||||
|
||||
|
||||
def try_transform_placeholder_string_to_regex(name):
|
||||
@@ -44,6 +45,9 @@ def try_transform_placeholder_string_to_regex(name):
|
||||
if 'CMAKE_MATCH_' in m:
|
||||
return '\\bCMAKE_MATCH_[0-9]+\\b'
|
||||
|
||||
if 'CMAKE_ARGV' in m:
|
||||
return '\\bCMAKE_ARGV[0-9]+\\b'
|
||||
|
||||
return '\\b{}\\b'.format('&id_re;'.join(list(m))) if 1 < len(m) else name
|
||||
|
||||
|
||||
@@ -109,11 +113,20 @@ def cmd_is_nulary(cmd):
|
||||
def cli(input_yaml, template):
|
||||
data = yaml.load(input_yaml)
|
||||
|
||||
# Partition `variables` list into "pure" words and regexes to match
|
||||
data['variables'] = {
|
||||
k: sorted(set(v)) for k, v in zip(_KW_RE_LIST, [*partition_iterable(lambda x: _TEMPLATED_NAME.search(x) is None, data['variables'])])
|
||||
# Partition `variables` and `environment-variables` lists into "pure" (key)words and regexes to match
|
||||
for var_key in _VAR_KIND_LIST:
|
||||
data[var_key] = {
|
||||
k: sorted(set(v)) for k, v in zip(
|
||||
_KW_RE_LIST
|
||||
, [*partition_iterable(lambda x: _TEMPLATED_NAME.search(x) is None, data[var_key])]
|
||||
)
|
||||
}
|
||||
data['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
|
||||
data['properties'] = {}
|
||||
@@ -122,17 +135,27 @@ def cli(input_yaml, template):
|
||||
props, props_re = partition_iterable(lambda x: _TEMPLATED_NAME.search(x) is None, data[prop])
|
||||
del data[prop]
|
||||
|
||||
data['properties'][python_prop_list_name] = {k: sorted(set(v)) for k, v in zip(_KW_RE_LIST, [props, props_re])}
|
||||
data['properties'][python_prop_list_name]['re'] = [*map(lambda x: try_transform_placeholder_string_to_regex(x), props_re)]
|
||||
|
||||
data['properties'][python_prop_list_name] = {
|
||||
k: sorted(set(v)) for k, v in zip(_KW_RE_LIST, [props, props_re])
|
||||
}
|
||||
data['properties'][python_prop_list_name]['re'] = [
|
||||
*map(lambda x: try_transform_placeholder_string_to_regex(x), props_re)
|
||||
]
|
||||
|
||||
data['properties']['kinds'] = [*map(lambda name: name.replace('-', '_'), _PROPERTY_KEYS)]
|
||||
|
||||
# Make all commands list
|
||||
data['commands'] = [*map(lambda cmd: transform_command(cmd), data['scripting-commands'] + data['project-commands'] + data['ctest-commands'])]
|
||||
data['commands'] = [
|
||||
*map(
|
||||
lambda cmd: transform_command(cmd)
|
||||
, data['scripting-commands'] + data['project-commands'] + data['ctest-commands'])
|
||||
]
|
||||
|
||||
# Fix node names to be accessible from Jinja template
|
||||
data['generator_expressions'] = data['generator-expressions']
|
||||
|
||||
data['environment_variables'] = data['environment-variables']
|
||||
del data['generator-expressions']
|
||||
del data['environment-variables']
|
||||
|
||||
env = jinja2.Environment(
|
||||
keep_trailing_newline=True
|
||||
|
||||
@@ -41,8 +41,15 @@ if ($root == 1)
|
||||
$file =~ s/<language([^>]+)mimetype="[^"]*"/<language$1mimetype="text\/x-php4-src;text\/x-php3-src;text\/vnd.wap.wml;application\/x-php"/s;
|
||||
}
|
||||
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([^>]+)section="[^"]*"/<language$1section="Other"/s;
|
||||
$file =~ s/<language([^>]+)extensions="[^"]*"/<language$1extensions=""/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=\"<\\?(?:=|php)?\" lookAhead=\"true\" />\n</context>\n";
|
||||
|
||||
$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/;
|
||||
|
||||
print $file;
|
||||
|
||||
@@ -279,9 +279,10 @@
|
||||
-->
|
||||
<xs:element name="list">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element minOccurs="0" maxOccurs="unbounded" ref="item"/>
|
||||
</xs:sequence>
|
||||
<xs:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:element ref="item"/>
|
||||
<xs:element ref="include"/>
|
||||
</xs:choice>
|
||||
<xs:attribute name="name" use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
@@ -290,6 +291,11 @@
|
||||
contains string used in <keyword>
|
||||
-->
|
||||
<xs:element name="item" type="xs:string"/>
|
||||
<!--
|
||||
List include
|
||||
contains a name of <keyword>
|
||||
-->
|
||||
<xs:element name="include" type="xs:string"/>
|
||||
<!-- List of contexts -->
|
||||
<xs:element name="contexts">
|
||||
<xs:complexType>
|
||||
@@ -305,6 +311,7 @@
|
||||
lineEndContext: Next context if end of line is encountered
|
||||
lineEmptyContext: Next context if an empty line is encountered [optional]
|
||||
fallthrough: Use a fallthrough context [optional]
|
||||
deprecated since 5.62 but preserved to maintain compatibility in older versions of KF5
|
||||
fallthroughContext: Fall through to this context [optional]
|
||||
dynamic: Dynamic context [boolean, optional]
|
||||
noIndentationBasedFolding: Python uses indentation based folding. However, Python has parts where
|
||||
@@ -314,7 +321,6 @@
|
||||
|
||||
TODO:
|
||||
- Explain fallthrough.
|
||||
- Do we need fallthrough at all? It could be true, if fallthroughContext is set, false otherwise.
|
||||
- Make lineEndContext optional, defaults to '#stay'. Reasonable?
|
||||
-->
|
||||
<xs:element name="context">
|
||||
@@ -344,7 +350,15 @@
|
||||
<xs:attribute name="attribute" use="required"/>
|
||||
<xs:attribute name="lineEndContext" use="required"/>
|
||||
<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="dynamic" type="xs:boolean"/>
|
||||
<xs:attribute name="noIndentationBasedFolding" type="xs:boolean"/>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
Copyright 2004 Alexander Neundorf (neundorf@kde.org)
|
||||
Copyright 2005 Dominik Haumann (dhdev@gmx.de)
|
||||
Copyright 2007,2008,2013,2014 Matthew Woehlke (mw_triad@users.sourceforge.net)
|
||||
Copyright 2013-2015,2017-2018 Alex Turbov (i.zaufi@gmail.com)
|
||||
Copyright 2013-2015,2017-2019 Alex Turbov (i.zaufi@gmail.com)
|
||||
|
||||
**********************************************************************
|
||||
* This library is free software; you can redistribute it and/or *
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
<language
|
||||
name="CMake"
|
||||
version="12"
|
||||
version="16"
|
||||
kateversion="2.4"
|
||||
section="Other"
|
||||
extensions="CMakeLists.txt;*.cmake;*.cmake.in"
|
||||
@@ -248,6 +248,7 @@
|
||||
</list>
|
||||
<list name="execute_process_nargs">
|
||||
<item>COMMAND</item>
|
||||
<item>COMMAND_ECHO</item>
|
||||
<item>ENCODING</item>
|
||||
<item>ERROR_FILE</item>
|
||||
<item>ERROR_QUIET</item>
|
||||
@@ -268,6 +269,8 @@
|
||||
<item>AUTO</item>
|
||||
<item>NONE</item>
|
||||
<item>OEM</item>
|
||||
<item>STDERR</item>
|
||||
<item>STDOUT</item>
|
||||
<item>UTF8</item>
|
||||
</list>
|
||||
<list name="file_nargs">
|
||||
@@ -287,6 +290,7 @@
|
||||
<item>FILES_MATCHING</item>
|
||||
<item>FILE_PERMISSIONS</item>
|
||||
<item>FOLLOW_SYMLINKS</item>
|
||||
<item>FOLLOW_SYMLINK_CHAIN</item>
|
||||
<item>GENERATE</item>
|
||||
<item>GLOB</item>
|
||||
<item>GLOB_RECURSE</item>
|
||||
@@ -567,6 +571,8 @@
|
||||
<item>LENGTH</item>
|
||||
<item>ORDER</item>
|
||||
<item>OUTPUT_VARIABLE</item>
|
||||
<item>POP_BACK</item>
|
||||
<item>POP_FRONT</item>
|
||||
<item>PREPEND</item>
|
||||
<item>REGEX</item>
|
||||
<item>REMOVE_AT</item>
|
||||
@@ -602,10 +608,14 @@
|
||||
</list>
|
||||
<list name="message_nargs">
|
||||
<item>AUTHOR_WARNING</item>
|
||||
<item>DEBUG</item>
|
||||
<item>DEPRECATION</item>
|
||||
<item>FATAL_ERROR</item>
|
||||
<item>NOTICE</item>
|
||||
<item>SEND_ERROR</item>
|
||||
<item>STATUS</item>
|
||||
<item>TRACE</item>
|
||||
<item>VERBOSE</item>
|
||||
<item>WARNING</item>
|
||||
</list>
|
||||
<list name="separate_arguments_nargs">
|
||||
@@ -671,6 +681,7 @@
|
||||
<item>RANDOM</item>
|
||||
<item>RANDOM_SEED</item>
|
||||
<item>REGEX</item>
|
||||
<item>REPEAT</item>
|
||||
<item>REPLACE</item>
|
||||
<item>REVERSE</item>
|
||||
<item>SHA1</item>
|
||||
@@ -737,6 +748,7 @@
|
||||
<item>DEPENDS</item>
|
||||
<item>DEPFILE</item>
|
||||
<item>IMPLICIT_DEPENDS</item>
|
||||
<item>JOB_POOL</item>
|
||||
<item>MAIN_DEPENDENCY</item>
|
||||
<item>OUTPUT</item>
|
||||
<item>POST_BUILD</item>
|
||||
@@ -757,6 +769,7 @@
|
||||
<item>DEPENDS</item>
|
||||
<item>DEPFILE</item>
|
||||
<item>IMPLICIT_DEPENDS</item>
|
||||
<item>JOB_POOL</item>
|
||||
<item>SOURCES</item>
|
||||
<item>USES_TERMINAL</item>
|
||||
<item>VERBATIM</item>
|
||||
@@ -1135,6 +1148,7 @@
|
||||
<item>TRACK</item>
|
||||
</list>
|
||||
<list name="ctest_submit_nargs">
|
||||
<item>BUILD_ID</item>
|
||||
<item>CDASH_UPLOAD</item>
|
||||
<item>CDASH_UPLOAD_TYPE</item>
|
||||
<item>FILES</item>
|
||||
@@ -1144,6 +1158,7 @@
|
||||
<item>RETRY_COUNT</item>
|
||||
<item>RETRY_DELAY</item>
|
||||
<item>RETURN_VALUE</item>
|
||||
<item>SUBMIT_URL</item>
|
||||
</list>
|
||||
<list name="ctest_test_nargs">
|
||||
<item>APPEND</item>
|
||||
@@ -1214,7 +1229,6 @@
|
||||
<item>CMAKE_AR</item>
|
||||
<item>CMAKE_ARCHIVE_OUTPUT_DIRECTORY</item>
|
||||
<item>CMAKE_ARGC</item>
|
||||
<item>CMAKE_ARGV0</item>
|
||||
<item>CMAKE_AUTOGEN_ORIGIN_DEPENDS</item>
|
||||
<item>CMAKE_AUTOGEN_PARALLEL</item>
|
||||
<item>CMAKE_AUTOGEN_VERBOSE</item>
|
||||
@@ -1288,10 +1302,12 @@
|
||||
<item>CMAKE_ERROR_DEPRECATED</item>
|
||||
<item>CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION</item>
|
||||
<item>CMAKE_EXECUTABLE_SUFFIX</item>
|
||||
<item>CMAKE_EXECUTE_PROCESS_COMMAND_ECHO</item>
|
||||
<item>CMAKE_EXE_LINKER_FLAGS</item>
|
||||
<item>CMAKE_EXE_LINKER_FLAGS_INIT</item>
|
||||
<item>CMAKE_EXPORT_COMPILE_COMMANDS</item>
|
||||
<item>CMAKE_EXPORT_NO_PACKAGE_REGISTRY</item>
|
||||
<item>CMAKE_EXPORT_PACKAGE_REGISTRY</item>
|
||||
<item>CMAKE_EXTRA_GENERATOR</item>
|
||||
<item>CMAKE_EXTRA_INCLUDE_FILES</item>
|
||||
<item>CMAKE_EXTRA_SHARED_LIBRARY_SUFFIXES</item>
|
||||
@@ -1305,6 +1321,7 @@
|
||||
<item>CMAKE_FIND_PACKAGE_NAME</item>
|
||||
<item>CMAKE_FIND_PACKAGE_NO_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_SORT_DIRECTION</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_PROGRAM</item>
|
||||
<item>CMAKE_FOLDER</item>
|
||||
<item>CMAKE_FRAMEWORK</item>
|
||||
<item>CMAKE_FRAMEWORK_PATH</item>
|
||||
<item>CMAKE_Fortran_FORMAT</item>
|
||||
<item>CMAKE_Fortran_MODDIR_DEFAULT</item>
|
||||
@@ -1432,6 +1450,8 @@
|
||||
<item>CMAKE_MODULE_LINKER_FLAGS</item>
|
||||
<item>CMAKE_MODULE_LINKER_FLAGS_INIT</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_FILE</item>
|
||||
<item>CMAKE_NINJA_OUTPUT_PATH_PREFIX</item>
|
||||
@@ -1454,6 +1474,8 @@
|
||||
<item>CMAKE_PROGRAM_PATH</item>
|
||||
<item>CMAKE_PROJECT_DESCRIPTION</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_VERSION</item>
|
||||
<item>CMAKE_PROJECT_VERSION_MAJOR</item>
|
||||
@@ -1465,6 +1487,7 @@
|
||||
<item>CMAKE_REQUIRED_FLAGS</item>
|
||||
<item>CMAKE_REQUIRED_INCLUDES</item>
|
||||
<item>CMAKE_REQUIRED_LIBRARIES</item>
|
||||
<item>CMAKE_REQUIRED_LINK_OPTIONS</item>
|
||||
<item>CMAKE_REQUIRED_QUIET</item>
|
||||
<item>CMAKE_ROOT</item>
|
||||
<item>CMAKE_RUNTIME_OUTPUT_DIRECTORY</item>
|
||||
@@ -1509,6 +1532,7 @@
|
||||
<item>CMAKE_SYSTEM_PROGRAM_PATH</item>
|
||||
<item>CMAKE_SYSTEM_VERSION</item>
|
||||
<item>CMAKE_Swift_LANGUAGE_VERSION</item>
|
||||
<item>CMAKE_Swift_MODULE_DIRECTORY</item>
|
||||
<item>CMAKE_THREAD_LIBS_INIT</item>
|
||||
<item>CMAKE_THREAD_PREFER_PTHREAD</item>
|
||||
<item>CMAKE_TOOLCHAIN_FILE</item>
|
||||
@@ -1529,6 +1553,7 @@
|
||||
<item>CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD</item>
|
||||
<item>CMAKE_VS_INCLUDE_PACKAGE_TO_DEFAULT_BUILD</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_NsightTegra_VERSION</item>
|
||||
<item>CMAKE_VS_PLATFORM_NAME</item>
|
||||
@@ -1658,6 +1683,7 @@
|
||||
<item>CPACK_IFW_PACKAGE_REMOVE_TARGET_DIR</item>
|
||||
<item>CPACK_IFW_PACKAGE_RESOURCES</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_COLOR</item>
|
||||
<item>CPACK_IFW_PACKAGE_WATERMARK</item>
|
||||
@@ -1908,6 +1934,7 @@
|
||||
<item>CTEST_UPDATE_COMMAND</item>
|
||||
<item>CTEST_UPDATE_OPTIONS</item>
|
||||
<item>CTEST_UPDATE_VERSION_ONLY</item>
|
||||
<item>CTEST_UPDATE_VERSION_OVERRIDE</item>
|
||||
<item>CTEST_USE_LAUNCHERS</item>
|
||||
<item>CYGWIN</item>
|
||||
<item>EXECUTABLE_OUTPUT_PATH</item>
|
||||
@@ -1990,6 +2017,45 @@
|
||||
<item>XCODE</item>
|
||||
<item>XCODE_VERSION</item>
|
||||
</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">
|
||||
<item>ALLOW_DUPLICATE_CUSTOM_TARGETS</item>
|
||||
<item>AUTOGEN_SOURCE_GROUP</item>
|
||||
@@ -2032,6 +2098,7 @@
|
||||
<item>XCODE_EMIT_EFFECTIVE_PLATFORM_NAME</item>
|
||||
</list>
|
||||
<list name="directory-properties">
|
||||
<item>ADDITIONAL_CLEAN_FILES</item>
|
||||
<item>ADDITIONAL_MAKE_CLEAN_FILES</item>
|
||||
<item>BINARY_DIR</item>
|
||||
<item>BUILDSYSTEM_TARGETS</item>
|
||||
@@ -2064,6 +2131,7 @@
|
||||
<item>VS_STARTUP_PROJECT</item>
|
||||
</list>
|
||||
<list name="target-properties">
|
||||
<item>ADDITIONAL_CLEAN_FILES</item>
|
||||
<item>ALIASED_TARGET</item>
|
||||
<item>ANDROID_ANT_ADDITIONAL_OPTIONS</item>
|
||||
<item>ANDROID_API</item>
|
||||
@@ -2207,6 +2275,7 @@
|
||||
<item>MACOSX_FRAMEWORK_INFO_PLIST</item>
|
||||
<item>MACOSX_RPATH</item>
|
||||
<item>MANUALLY_ADDED_DEPENDENCIES</item>
|
||||
<item>MSVC_RUNTIME_LIBRARY</item>
|
||||
<item>NAME</item>
|
||||
<item>NO_SONAME</item>
|
||||
<item>NO_SYSTEM_FROM_IMPORTED</item>
|
||||
@@ -2232,6 +2301,9 @@
|
||||
<item>STATIC_LIBRARY_FLAGS</item>
|
||||
<item>STATIC_LIBRARY_OPTIONS</item>
|
||||
<item>SUFFIX</item>
|
||||
<item>Swift_DEPENDENCIES_FILE</item>
|
||||
<item>Swift_MODULE_DIRECTORY</item>
|
||||
<item>Swift_MODULE_NAME</item>
|
||||
<item>TYPE</item>
|
||||
<item>VERSION</item>
|
||||
<item>VISIBILITY_INLINES_HIDDEN</item>
|
||||
@@ -2249,8 +2321,12 @@
|
||||
<item>VS_GLOBAL_ROOTNAMESPACE</item>
|
||||
<item>VS_IOT_EXTENSIONS_VERSION</item>
|
||||
<item>VS_IOT_STARTUP_TASK</item>
|
||||
<item>VS_JUST_MY_CODE_DEBUGGING</item>
|
||||
<item>VS_KEYWORD</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_LOCALPATH</item>
|
||||
<item>VS_SCC_PROJECTNAME</item>
|
||||
@@ -2264,10 +2340,12 @@
|
||||
<item>WIN32_EXECUTABLE</item>
|
||||
<item>WINDOWS_EXPORT_ALL_SYMBOLS</item>
|
||||
<item>XCODE_EXPLICIT_FILE_TYPE</item>
|
||||
<item>XCODE_GENERATE_SCHEME</item>
|
||||
<item>XCODE_PRODUCT_TYPE</item>
|
||||
<item>XCODE_SCHEME_ADDRESS_SANITIZER</item>
|
||||
<item>XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN</item>
|
||||
<item>XCODE_SCHEME_ARGUMENTS</item>
|
||||
<item>XCODE_SCHEME_DEBUG_AS_ROOT</item>
|
||||
<item>XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER</item>
|
||||
<item>XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS</item>
|
||||
<item>XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE</item>
|
||||
@@ -2309,6 +2387,8 @@
|
||||
<item>SKIP_AUTORCC</item>
|
||||
<item>SKIP_AUTOUIC</item>
|
||||
<item>SYMBOLIC</item>
|
||||
<item>Swift_DEPENDENCIES_FILE</item>
|
||||
<item>Swift_DIAGNOSTICS_FILE</item>
|
||||
<item>VS_COPY_TO_OUT_DIR</item>
|
||||
<item>VS_DEPLOYMENT_CONTENT</item>
|
||||
<item>VS_DEPLOYMENT_LOCATION</item>
|
||||
@@ -2375,61 +2455,76 @@
|
||||
<list name="generator-expressions">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>AND</item>
|
||||
<item>ANGLE-R</item>
|
||||
<item>BOOL</item>
|
||||
<item>BUILD_INTERFACE</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>AND</item>
|
||||
<item>OR</item>
|
||||
<item>PLATFORM_ID</item>
|
||||
<item>SEMICOLON</item>
|
||||
<item>SHELL_PATH</item>
|
||||
<item>NOT</item>
|
||||
<item>STREQUAL</item>
|
||||
<item>TARGET_BUNDLE_CONTENT_DIR</item>
|
||||
<item>TARGET_BUNDLE_DIR</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>EQUAL</item>
|
||||
<item>IN_LIST</item>
|
||||
<item>VERSION_LESS</item>
|
||||
<item>VERSION_GREATER</item>
|
||||
<item>VERSION_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>
|
||||
|
||||
<contexts>
|
||||
@@ -2662,11 +2757,18 @@
|
||||
<DetectChar attribute="Normal Text" context="execute_process_ctx_op" char="(" />
|
||||
</context>
|
||||
<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" />
|
||||
<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="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">
|
||||
<DetectChar attribute="Normal Text" context="file_ctx_op" char="(" />
|
||||
</context>
|
||||
@@ -2978,18 +3080,30 @@
|
||||
<DetectChar attribute="Normal Text" context="add_custom_command_ctx_op" char="(" />
|
||||
</context>
|
||||
<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" />
|
||||
<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_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">
|
||||
<DetectChar attribute="Normal Text" context="add_custom_target_ctx_op" char="(" />
|
||||
</context>
|
||||
<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" />
|
||||
<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_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">
|
||||
<DetectChar attribute="Normal Text" context="add_definitions_ctx_op" char="(" />
|
||||
</context>
|
||||
@@ -3039,10 +3153,16 @@
|
||||
<DetectChar attribute="Normal Text" context="add_test_ctx_op" char="(" />
|
||||
</context>
|
||||
<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" />
|
||||
<keyword attribute="Named Args" context="#stay" String="add_test_nargs" />
|
||||
<IncludeRules context="User Function Args" />
|
||||
</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">
|
||||
<DetectChar attribute="Normal Text" context="aux_source_directory_ctx_op" char="(" />
|
||||
</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;_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_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_DISABLE_FIND_PACKAGE_&id_re;\b" />
|
||||
<RegExpr attribute="Builtin Variable" context="#stay" String="\bCMAKE_EXE_LINKER_FLAGS_&id_re;\b" />
|
||||
@@ -3727,11 +3848,28 @@
|
||||
</context>
|
||||
|
||||
<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="{" />
|
||||
<RegExpr attribute="@Variable Substitution" context="@VarSubst" String="@&id_re;@" lookAhead="true" />
|
||||
</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">
|
||||
<IncludeRules context="Detect Builtin Variables" />
|
||||
<DetectIdentifier />
|
||||
@@ -3830,10 +3968,12 @@
|
||||
<itemData name="Strings" defStyleNum="dsString" spellChecking="true" />
|
||||
<itemData name="Escapes" defStyleNum="dsChar" 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="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="Standard Environment Variable" defStyleNum="dsFloat" 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="Comment" defStyleNum="dsComment" spellChecking="true" />
|
||||
|
||||
@@ -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>
|
||||
<list name="properties">
|
||||
@@ -1258,8 +1259,9 @@ Changelog:
|
||||
<item>selection</item>
|
||||
</list>
|
||||
|
||||
<list name="pseudoclass-not">
|
||||
<list name="pseudoclass-selector">
|
||||
<item>not</item>
|
||||
<item>matches</item>
|
||||
</list>
|
||||
|
||||
<list name="pseudoclasses-@page">
|
||||
@@ -1383,8 +1385,8 @@ Changelog:
|
||||
<keyword attribute="Value Keyword" context="#stay" String="value keywords" />
|
||||
<keyword attribute="Value" context="#stay" String="values" />
|
||||
<keyword attribute="Color" context="#stay" String="colors" />
|
||||
<RegExpr attribute="Color" context="#stay" String="#([0-9A-Fa-f]{3}){1,2}\b" />
|
||||
<RegExpr attribute="Number" context="FindUnits" String="[-+]?[0-9.]+(?![-+])" />
|
||||
<RegExpr attribute="Color" context="#stay" String="#([0-9A-Fa-f]{3,4}){1,2}\b" />
|
||||
<RegExpr attribute="Number" context="FindUnits" String="[-+]?([0-9]+(\.[0-9]+)?|\.[0-9]+)([eE][+-]?[0-9]+)?(?![-+])" />
|
||||
<RegExpr attribute="Normal Text" context="#stay" String="[-]?(&nmstart;)(&nmchar;)*" />
|
||||
</context>
|
||||
|
||||
@@ -1393,7 +1395,8 @@ Changelog:
|
||||
</context>
|
||||
|
||||
<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>
|
||||
|
||||
<!-- find strings // "some words" 'some words' -->
|
||||
@@ -1548,7 +1551,7 @@ Changelog:
|
||||
|
||||
<context name="SelectorPseudo" attribute="Selector Pseudo" lineEndContext="#pop">
|
||||
<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" />
|
||||
<RegExpr attribute="Selector Pseudo" context="SelectorPseudoValue" String="[-a-zA-Z][-a-zA-Z0-9]*" />
|
||||
</context>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<!ENTITY attributeName "[A-Za-z_:*#\(\[][\)\]\w.:_-]*">
|
||||
<!ENTITY entref "&(#[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>
|
||||
<contexts>
|
||||
@@ -20,8 +20,19 @@
|
||||
<StringDetect attribute="CDATA" context="CDATA" String="<![CDATA[" beginRegion="cdata" />
|
||||
<RegExpr attribute="Doctype" context="Doctype" String="<!DOCTYPE\s+" insensitive="true" beginRegion="doctype" />
|
||||
<RegExpr attribute="Processing Instruction" context="PI" String="<\?[\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="<style\b" insensitive="true" beginRegion="style" />
|
||||
<RegExpr attribute="Element" context="JS" String="<script\b" insensitive="true" beginRegion="script" />
|
||||
</context>
|
||||
|
||||
<context name="FindHTMLTags" attribute="Normal Text" lineEndContext="#stay">
|
||||
<RegExpr attribute="Element" context="El Open" String="<pre\b" insensitive="true" beginRegion="pre" />
|
||||
<RegExpr attribute="Element" context="El Open" String="<div\b" insensitive="true" beginRegion="div" />
|
||||
<RegExpr attribute="Element" context="El Open" String="<table\b" insensitive="true" beginRegion="table" />
|
||||
@@ -54,8 +65,6 @@
|
||||
<RegExpr attribute="Element" context="El Close" String="</nav\b" insensitive="true" endRegion="nav" />
|
||||
<RegExpr attribute="Element" context="El Close" String="</section\b" insensitive="true" endRegion="section" />
|
||||
<RegExpr attribute="Element" context="El Close" String="</&name;" />
|
||||
<!-- as long as kde gives DTDs the text/html mimetype--><IncludeRules context="FindDTDRules" />
|
||||
<IncludeRules context="FindEntityRefs" />
|
||||
</context>
|
||||
|
||||
<context name="FindEntityRefs" attribute="Other Text" lineEndContext="#stay">
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
** 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>
|
||||
<list name="Constants">
|
||||
<item>null</item>
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
Dual-Licensed under both GPL and BSD licenses.
|
||||
|
||||
Extended 2009 Claes Holmerson. http://github.com/claes/kate-markdown/
|
||||
Extended 2019 Nibaldo González S. <nibgonz@gmail.com> (changes under MIT license).
|
||||
-->
|
||||
<!--
|
||||
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,
|
||||
followed by anything non-asterisk, followed by "*", followed by
|
||||
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"
|
||||
[
|
||||
<!ENTITY strongemphasisregex "(\s|^)[\*_]{3}[^\*_]+[\*_]{3}(\s|\.|,|;|:|\-|\?|$)">
|
||||
<!ENTITY strongregex "(\s|^)[\*_]{2}[^\s]{1}[^\*_]+[\*_]{2}(\s|\.|,|;|:|\-|\?|$)">
|
||||
<!ENTITY emphasisregex "(\s|^)[\*_]{1}[^\s]{1}[^\*_]+[\*_]{1}(\s|\.|,|;|:|\-|\?|$)">
|
||||
<!ENTITY reflinkregex '\[[^\]\^]+\]\s*\[[^\]]*\]\s*(\s+\"[^\"]*\"){0,1}'>
|
||||
<!ENTITY reflinktargetregex '\[[^\]\^]+\]\:\s+[^\s]+(\s+\"[^\"]*\"){0,1}'>
|
||||
<!ENTITY footnoteregex "\[\^[^\]]+\]">
|
||||
<!ENTITY inlinelinkregex "\[[^\]\^]+\]\s*\([^\(]*\)">
|
||||
<!ENTITY inlineimageregex "\!\[[^\]\^]+\]\([^\(]*\)">
|
||||
<!ENTITY refimageregex "\!\[[^\]\^]+\]\[[^\[]*\]">
|
||||
<!ENTITY autolinkregex '<(https?|ftp):[^\">\s]+>'>
|
||||
<!ENTITY mailtolinkregex "<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>">
|
||||
<!ENTITY rulerregex "\s*([\*\-_]\s?){3,}\s*">
|
||||
<!-- NOTE: To correctly detect bold, italic or strike out text, use minimal="true" in RegExpr rules -->
|
||||
<!ENTITY contentregex_ast "(?:(?:[^\*\s\\]|\\.)(?:[^\\]|\\.)*)?(?:[^\*\s\\]|\\\S)">
|
||||
<!ENTITY contentregex_und "(?:(?:[^_\s\\]|\\.)(?:[^\\]|\\.)*)?(?:[^_\s\\]|\\\S)">
|
||||
<!-- strong + emphasis text -->
|
||||
<!ENTITY strongemphasisregex_ast "\*{3,5}&contentregex_ast;\*{3}">
|
||||
<!ENTITY strongemphasisregex_und "\b_{3,5}&contentregex_und;_{3}">
|
||||
<!ENTITY strongemphasisregex_ast_und "\*{2,5}(?:(?:_|_{3}|_{5})&contentregex_und;_+|(?:_{2}|_{4})&contentregex_und;_)\*{2}">
|
||||
<!ENTITY strongemphasisregex_ast_und2 "\*_{2,5}&contentregex_und;_{2,5}\*(?!\*)">
|
||||
<!ENTITY strongemphasisregex_und_ast "\b_{2,5}(?:(?:\*|\*{3}|\*{5})&contentregex_ast;\*+|(?:\*{2}|\*{4})&contentregex_ast;\*)_{2}">
|
||||
<!ENTITY strongemphasisregex_und_ast2 "\b_(?:\*{2,5}&contentregex_ast;\*{2,5}_{0,4}|_{0,4}\*{2,5}&contentregex_ast;\*{2,5})_\b">
|
||||
<!-- strong text -->
|
||||
<!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;[^">\s]+">
|
||||
<!-- link in normal text -->
|
||||
<!ENTITY implicitlink "\b&startlink;[^">\s`\)]*[^\s!"'`\(\)\*,\.:;<>\?~\]\}\\](?=[[: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][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 '<&link;>'>
|
||||
<!ENTITY email "[\-\.\w]+\@[\-a-z0-9]+(?:\.[\-a-z0-9]+)*\.[a-z]+">
|
||||
<!ENTITY mailtolinkregex "<(?:mailto:)?(?=&email;>)">
|
||||
<!-- 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 -->
|
||||
<!ENTITY linebreakregex " $">
|
||||
<!ENTITY strikeoutregex "[~]{2}[^~].*[^~][~]{2}">
|
||||
<!-- pandoc style -->
|
||||
<!-- strikethrough text, 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 "<!--">
|
||||
<!ENTITY endcomment "-->">
|
||||
<!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>
|
||||
<contexts>
|
||||
<context attribute="Normal Text" lineEndContext="#stay" name="Normal Text">
|
||||
<DetectChar context="blockquote" char=">" column="0"/>
|
||||
<RegExpr attribute="h1" String="^#\s.*[#]?$"/>
|
||||
<RegExpr attribute="h2" String="^##\s.*[#]?$"/>
|
||||
<RegExpr attribute="h3" String="^###\s.*[#]?$"/>
|
||||
<RegExpr attribute="h4" String="^####\s.*[#]?$"/>
|
||||
<RegExpr attribute="h5" String="^#####\s.*[#]?$"/>
|
||||
<RegExpr attribute="h6" String="^######\s.*[#]?$"/>
|
||||
<RegExpr attribute="ruler" String="&rulerregex;"/>
|
||||
<RegExpr attribute="strong" String="&strongregex;"/>
|
||||
<RegExpr attribute="emphasis" String="&emphasisregex;"/>
|
||||
<RegExpr attribute="strongemphasis" String="&strongemphasisregex;"/>
|
||||
<RegExpr attribute="code" String="^([\s]{4,}|\t+).*$"/>
|
||||
<RegExpr context="bullet" String="^[\*\+\-]\s"/>
|
||||
<RegExpr context="numlist" String="^[\d]+\.\s"/>
|
||||
<RegExpr attribute="meta" String="^(Title|Author|Date|Copyright|Revision|CSS|LaTeX\ XSLT|Categories|Tags|BaseName|Excerpt):(.*)+$"/>
|
||||
<!-- Start of the Markdown document: find metadata or code block -->
|
||||
<context name="Start Document" attribute="Normal Text" lineEndContext="Normal Text" lineEmptyContext="Normal Text" fallthrough="true" fallthroughContext="Normal Text">
|
||||
<!-- Some titles: (Title|Author|Date|Copyright|Revision|CSS|LaTeX\ XSLT|Categories|Tags|BaseName|Excerpt) -->
|
||||
<!-- Metadata: Markdown format -->
|
||||
<RegExpr attribute="Metadata" context="metadata" String="\-{3}&end;" column="0" beginRegion="metadata"/>
|
||||
<!-- Metadata: MultiMarkdown format -->
|
||||
<RegExpr attribute="Metadata Title" context="metadata-mm-value" String="^&metadatakey;(?=\s|$)" column="0"/>
|
||||
<!-- Code Block -->
|
||||
<RegExpr attribute="Code" context="find-code-block-start" String="^&indentedcodeblock;" column="0"/>
|
||||
</context>
|
||||
<context name="metadata" attribute="Metadata" lineEndContext="#stay">
|
||||
<StringDetect attribute="Metadata" context="#pop!Normal Text" String="---" column="0" endRegion="metadata"/>
|
||||
<StringDetect attribute="Metadata" context="#pop!Normal Text" String="..." column="0" endRegion="metadata"/>
|
||||
<RegExpr attribute="Metadata Title" String="^&metadatakey;(?=\s|$)" column="0"/>
|
||||
</context>
|
||||
<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=">" 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"/>
|
||||
<RegExpr attribute="Normal Text: Link" String="&implicitlink;"/>
|
||||
</context>
|
||||
<context attribute="blockquote" lineEndContext="#stay" lineEmptyContext="#pop" name="blockquote">
|
||||
<RegExpr attribute="bq-strong" String="&strongregex;"/>
|
||||
<RegExpr attribute="bq-emphasis" String="&emphasisregex;"/>
|
||||
<!-- Find indented code blocks. These are only allowed after an empty line or on the first line -->
|
||||
<context name="find-code-block" attribute="Normal Text" lineEndContext="#stay" lineEmptyContext="#stay" fallthrough="true" fallthroughContext="#pop">
|
||||
<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=">" 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"/>
|
||||
<RegExpr attribute="Blockquote: Link" String="&implicitlink;"/>
|
||||
</context>
|
||||
<context attribute="bullet" lineEndContext="#stay" lineEmptyContext="#pop" name="bullet">
|
||||
<RegExpr attribute="bl-strong" String="&strongregex;"/>
|
||||
<RegExpr attribute="bl-emphasis" String="&emphasisregex;"/>
|
||||
<context name="find-strong-emphasis-blockquote" attribute="Blockquote: Normal Text" lineEndContext="#pop">
|
||||
<RegExpr attribute="Blockquote: Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_ast_und;"/>
|
||||
<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+>" 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,}>" 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,}>" 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*(?:>|&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"/>
|
||||
<RegExpr attribute="List: Link" String="&implicitlink;"/>
|
||||
</context>
|
||||
<context attribute="numlist" lineEndContext="#stay" lineEmptyContext="#pop" name="numlist">
|
||||
<RegExpr attribute="nl-strong" String="&strongregex;"/>
|
||||
<RegExpr attribute="nl-emphasis" String="&emphasisregex;"/>
|
||||
<IncludeRules context="inc"/>
|
||||
<context name="find-strong-emphasis-list" attribute="List: Normal Text" lineEndContext="#pop">
|
||||
<RegExpr attribute="List: Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_ast_und;"/>
|
||||
<RegExpr attribute="List: Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_und_ast;"/>
|
||||
<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 attribute="comment" lineEndContext="#stay" name="comment">
|
||||
<RegExpr String="-->" 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 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"/>
|
||||
</context>
|
||||
<context attribute="code" lineEndContext="#stay" name="cmake-code">
|
||||
<WordDetect attribute="code" context="#pop" String="```"/>
|
||||
<context attribute="Normal Text" lineEndContext="#stay" name="cmake-code">
|
||||
<IncludeRules context="code"/>
|
||||
<IncludeRules context="##CMake" includeAttrib="true"/>
|
||||
</context>
|
||||
<context attribute="code" lineEndContext="#stay" name="cpp-code">
|
||||
<WordDetect attribute="code" context="#pop" String="```"/>
|
||||
<context attribute="Normal Text" lineEndContext="#stay" name="c-code">
|
||||
<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"/>
|
||||
</context>
|
||||
<context attribute="code" lineEndContext="#stay" name="css-code">
|
||||
<WordDetect attribute="code" context="#pop" String="```"/>
|
||||
<context attribute="Normal Text" lineEndContext="#stay" name="csharp-code">
|
||||
<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"/>
|
||||
</context>
|
||||
<context attribute="code" lineEndContext="#stay" name="email-code">
|
||||
<WordDetect attribute="code" context="#pop" String="```"/>
|
||||
<context attribute="Normal Text" lineEndContext="#stay" name="doxygen-code">
|
||||
<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"/>
|
||||
</context>
|
||||
<context attribute="code" lineEndContext="#stay" name="haskell-code">
|
||||
<WordDetect attribute="code" context="#pop" String="```"/>
|
||||
<context attribute="Normal Text" lineEndContext="#stay" name="go-code">
|
||||
<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"/>
|
||||
</context>
|
||||
<context attribute="code" lineEndContext="#stay" name="html-code">
|
||||
<WordDetect attribute="code" context="#pop" String="```"/>
|
||||
<context attribute="Normal Text" lineEndContext="#stay" name="html-code">
|
||||
<IncludeRules context="code"/>
|
||||
<IncludeRules context="##HTML" includeAttrib="true"/>
|
||||
</context>
|
||||
<context attribute="code" lineEndContext="#stay" name="json-code">
|
||||
<WordDetect attribute="code" context="#pop" String="```"/>
|
||||
<context attribute="Normal Text" lineEndContext="#stay" name="java-code">
|
||||
<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"/>
|
||||
</context>
|
||||
<context attribute="code" lineEndContext="#stay" name="php-code">
|
||||
<WordDetect attribute="code" context="#pop" String="```"/>
|
||||
<context attribute="Normal Text" lineEndContext="#stay" lineEmptyContext="find-code-block" name="markdown-code">
|
||||
<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"/>
|
||||
</context>
|
||||
<context attribute="code" lineEndContext="#stay" name="python-code">
|
||||
<WordDetect attribute="code" context="#pop" String="```"/>
|
||||
<context attribute="Normal Text" lineEndContext="#stay" name="python-code">
|
||||
<IncludeRules context="code"/>
|
||||
<IncludeRules context="##Python" includeAttrib="true"/>
|
||||
</context>
|
||||
<context attribute="code" lineEndContext="#stay" name="qml-code">
|
||||
<WordDetect attribute="code" context="#pop" String="```"/>
|
||||
<context attribute="Normal Text" lineEndContext="#stay" name="qml-code">
|
||||
<IncludeRules context="code"/>
|
||||
<IncludeRules context="##QML" includeAttrib="true"/>
|
||||
</context>
|
||||
<context attribute="code" lineEndContext="#stay" name="rust-code">
|
||||
<WordDetect attribute="code" context="#pop" String="```"/>
|
||||
<context attribute="Normal Text" lineEndContext="#stay" name="r-code">
|
||||
<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"/>
|
||||
</context>
|
||||
<context attribute="code" lineEndContext="#stay" name="xml-code">
|
||||
<WordDetect attribute="code" context="#pop" String="```"/>
|
||||
<context attribute="Normal Text" lineEndContext="#stay" name="mysql-code">
|
||||
<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"/>
|
||||
</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="<"/>
|
||||
<Detect2Chars attribute="Backslash Escape" char="\" char1=">"/>
|
||||
<Detect2Chars attribute="Backslash Escape" char="\" char1="&"/>
|
||||
<!-- Inline HTML -->
|
||||
<RegExpr attribute="EntityRef" String="&(?:#[0-9]+|#[xX][0-9A-Fa-f]+|&htmlname;);"/>
|
||||
<RegExpr context="find-html-block" String="</?&htmlname;(?:[\s>]|/>|$)" lookAhead="true"/>
|
||||
</context>
|
||||
<context attribute="common" name="inc" lineEndContext="#stay">
|
||||
<RegExpr attribute="code" String="`[^`]+`"/>
|
||||
<RegExpr context="comment" String="<!--" beginRegion="comment"/>
|
||||
<RegExpr attribute="reflink" String="&reflinkregex;"/>
|
||||
<RegExpr attribute="footnote" String="&footnoteregex;"/>
|
||||
<RegExpr attribute="inlinelink" String="&inlinelinkregex;"/>
|
||||
<RegExpr attribute="reflinktarget" String="&reflinktargetregex;"/>
|
||||
<RegExpr attribute="inlineimage" String="&inlineimageregex;"/>
|
||||
<RegExpr attribute="refimage" String="&refimageregex;"/>
|
||||
<RegExpr attribute="autolink" String="&autolinkregex;"/>
|
||||
<RegExpr attribute="mailtolink" String="&mailtolinkregex;"/>
|
||||
<RegExpr attribute="strikeout" minimal="true" String="&strikeoutregex;"/>
|
||||
<RegExpr attribute="linebreak" minimal="true" String="&linebreakregex;"/>
|
||||
<WordDetect attribute="code" context="bash-code" String="```bash"/>
|
||||
<WordDetect attribute="code" context="cmake-code" String="```cmake"/>
|
||||
<WordDetect attribute="code" context="cpp-code" String="```cpp"/>
|
||||
<WordDetect attribute="code" context="css-code" String="```css"/>
|
||||
<WordDetect attribute="code" context="email-code" String="```email"/>
|
||||
<WordDetect attribute="code" context="haskell-code" String="```haskell"/>
|
||||
<WordDetect attribute="code" context="html-code" String="```html"/>
|
||||
<WordDetect attribute="code" context="json-code" String="```json"/>
|
||||
<WordDetect attribute="code" context="php-code" String="```php"/>
|
||||
<WordDetect attribute="code" context="python-code" String="```python"/>
|
||||
<WordDetect attribute="code" context="qml-code" String="```qml"/>
|
||||
<WordDetect attribute="code" context="rust-code" String="```rust"/>
|
||||
<WordDetect attribute="code" context="xml-code" String="```xml"/>
|
||||
<StringDetect attribute="code" context="code" String="```"/>
|
||||
<context name="find-html-block" attribute="Normal Text" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop">
|
||||
<IncludeRules context="FindSpecialHTMLTags##HTML"/>
|
||||
<IncludeRules context="FindHTMLTags##HTML"/>
|
||||
</context>
|
||||
|
||||
<!-- Links and email: <https://example.com>, <example@kde.org> -->
|
||||
<context name="autolink" attribute="Auto-Link" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop">
|
||||
<DetectChar attribute="Auto-Link" char="<"/>
|
||||
<DetectChar attribute="Auto-Link" context="#pop" char=">"/>
|
||||
<RegExpr attribute="Link" String="&startlink;[^">\s]+"/>
|
||||
</context>
|
||||
<context name="mailtolink" attribute="Email" lineEndContext="#pop">
|
||||
<DetectChar attribute="Mailto-Link" context="#pop" char=">"/>
|
||||
</context>
|
||||
|
||||
<!-- References: [example][id], [example](http://example.com) -->
|
||||
<context name="find-reflink" attribute="Reference-Link Name" lineEndContext="#pop">
|
||||
<Detect2Chars attribute="Reference-Link Name" char="\" char1="]"/>
|
||||
<RegExpr attribute="Reference-Link" context="#pop!find-reflink-id" String="\](?=&reflinkidregex;)"/> <!-- Find id -->
|
||||
<DetectChar attribute="Reference-Link" context="#pop" char="]"/>
|
||||
<!-- Image as link or reference -->
|
||||
<RegExpr attribute="Inline Image" context="inlineimage" String="&startinlineimage;(?=&endinlineimage;&refchar;*\])"/>
|
||||
<RegExpr attribute="Reference Image" String="&refimageregex;(?=&refchar;*\])"/>
|
||||
<RegExpr attribute="Reference-Link Name" context="#stay" String="(?:\[(?:\\.|[^\[\]\\])*\](?:\\.|[^\[\]\\])*)+(?=\])" minimal="true"/>
|
||||
</context>
|
||||
<context name="find-reflink-id" attribute="Reference-Link" lineEndContext="#pop">
|
||||
<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;(?:\\.|[^">\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;(?:\\.|[^">\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+"(?:\\.|[^"\\])*""/>
|
||||
</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*<(?=&link;>(?:\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=">"/>
|
||||
<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=""(?:\\.|[^"\\])*""/>
|
||||
<RegExpr attribute="Reference-Link Target" context="#pop" String="'(?:\\.|[^'\\])*'"/>
|
||||
<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;(?:\\.|[^">\s\)\\])+"/>
|
||||
</context>
|
||||
</contexts>
|
||||
<itemDatas>
|
||||
<itemData name="Normal Text" defStyleNum="dsNormal"/>
|
||||
<itemData name="common" defStyleNum="dsNormal"/>
|
||||
<itemData name="strongemphasis" defStyleNum="dsNormal" italic="true" bold="true"/>
|
||||
<itemData name="emphasis" defStyleNum="dsNormal" italic="true"/>
|
||||
<itemData name="strong" defStyleNum="dsNormal" bold="true"/>
|
||||
<itemData name="ruler" defStyleNum="dsNormal" bold="true"/>
|
||||
<itemData name="strikeout" defStyleNum="dsNormal" strikeOut="true"/>
|
||||
<itemData name="linebreak" defStyleNum="dsNormal" underline="true" color="#999999"/>
|
||||
<itemData name="h1" defStyleNum="dsFunction" bold="true"/>
|
||||
<itemData name="h2" defStyleNum="dsFunction" bold="true"/>
|
||||
<itemData name="h3" defStyleNum="dsFunction" bold="true"/>
|
||||
<itemData name="h4" defStyleNum="dsFunction" bold="true"/>
|
||||
<itemData name="h5" defStyleNum="dsFunction" bold="true"/>
|
||||
<itemData name="h6" defStyleNum="dsFunction" bold="true"/>
|
||||
<itemData name="blockquote" defStyleNum="dsDataType"/>
|
||||
<itemData name="bq-emphasis" defStyleNum="dsDataType" italic="true"/>
|
||||
<itemData name="bq-strong" defStyleNum="dsDataType" bold="true"/>
|
||||
<itemData name="bullet" defStyleNum="dsString"/>
|
||||
<itemData name="bl-emphasis" defStyleNum="dsString" italic="true"/>
|
||||
<itemData name="bl-strong" defStyleNum="dsString" bold="true"/>
|
||||
<itemData name="numlist" defStyleNum="dsString"/>
|
||||
<itemData name="nl-emphasis" defStyleNum="dsString" italic="true"/>
|
||||
<itemData name="nl-strong" defStyleNum="dsString" bold="true"/>
|
||||
<itemData name="comment" defStyleNum="dsComment"/>
|
||||
<itemData name="code" defStyleNum="dsBaseN"/>
|
||||
<itemData name="reflink" defStyleNum="dsOthers" underline="true"/>
|
||||
<itemData name="inlinelink" defStyleNum="dsOthers" underline="true"/>
|
||||
<itemData name="autolink" defStyleNum="dsOthers" underline="true"/>
|
||||
<itemData name="mailtolink" defStyleNum="dsOthers" underline="true"/>
|
||||
<itemData name="footnote" defStyleNum="dsOthers" italic="true"/>
|
||||
<itemData name="meta" defStyleNum="dsComment"/>
|
||||
<itemData name="reflinktarget" defStyleNum="dsOthers" italic="false" bold="false"/>
|
||||
<itemData name="inlineimage" defStyleNum="dsAlert" italic="false" bold="false"/>
|
||||
<itemData name="refimage" defStyleNum="dsAlert" italic="false" bold="false"/>
|
||||
<itemData name="Emphasis Text" defStyleNum="dsNormal" italic="true"/>
|
||||
<itemData name="Strong Text" defStyleNum="dsNormal" bold="true"/>
|
||||
<itemData name="Strong-Emphasis Text" defStyleNum="dsNormal" italic="true" bold="true"/>
|
||||
<itemData name="Strikethrough Text" defStyleNum="dsNormal" strikeOut="true"/>
|
||||
<itemData name="Normal Text: Link" defStyleNum="dsNormal" underline="true" spellChecking="false"/>
|
||||
<itemData name="Horizontal Rule" defStyleNum="dsNormal" bold="true" spellChecking="false"/>
|
||||
<itemData name="Line Break" defStyleNum="dsNormal" underline="true" color="#999999" spellChecking="false"/>
|
||||
<itemData name="Header H1" defStyleNum="dsFunction" bold="true"/>
|
||||
<itemData name="Header H2" defStyleNum="dsFunction" bold="true"/>
|
||||
<itemData name="Header H3" defStyleNum="dsFunction" bold="true"/>
|
||||
<itemData name="Header H4" defStyleNum="dsFunction" bold="true"/>
|
||||
<itemData name="Header H5" defStyleNum="dsFunction" bold="true"/>
|
||||
<itemData name="Header H6" defStyleNum="dsFunction" bold="true"/>
|
||||
<itemData name="Blockquote" defStyleNum="dsAttribute" spellChecking="false"/>
|
||||
<itemData name="Blockquote: Normal Text" defStyleNum="dsAttribute"/>
|
||||
<itemData name="Blockquote: Emphasis Text" defStyleNum="dsAttribute" italic="true"/>
|
||||
<itemData name="Blockquote: Strong Text" defStyleNum="dsAttribute" bold="true"/>
|
||||
<itemData name="Blockquote: Strong-Emphasis Text" defStyleNum="dsAttribute" italic="true" bold="true"/>
|
||||
<itemData name="Blockquote: Strikethrough Text" defStyleNum="dsAttribute" strikeOut="true"/>
|
||||
<itemData name="Blockquote: Link" defStyleNum="dsAttribute" underline="true" spellChecking="false"/>
|
||||
<itemData name="List" defStyleNum="dsSpecialString" bold="1" spellChecking="false"/>
|
||||
<itemData name="Number List" defStyleNum="dsSpecialString" spellChecking="false"/>
|
||||
<itemData name="List: Normal Text" defStyleNum="dsNormal"/>
|
||||
<itemData name="List: Emphasis Text" defStyleNum="dsNormal" italic="true"/>
|
||||
<itemData name="List: Strong Text" defStyleNum="dsNormal" bold="true"/>
|
||||
<itemData name="List: Strong-Emphasis Text" defStyleNum="dsNormal" italic="true" bold="true"/>
|
||||
<itemData name="List: Strikethrough Text" defStyleNum="dsNormal" strikeOut="true"/>
|
||||
<itemData name="List: Link" defStyleNum="dsNormal" underline="true" spellChecking="false"/>
|
||||
<itemData name="List: Checkbox" defStyleNum="dsVariable" spellChecking="false"/>
|
||||
<itemData name="Comment" defStyleNum="dsComment"/>
|
||||
<itemData name="Code" defStyleNum="dsInformation"/>
|
||||
<itemData name="Fenced Code" defStyleNum="dsInformation" spellChecking="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>
|
||||
</highlighting>
|
||||
<general>
|
||||
<keywords additionalDeliminator="`"/>
|
||||
<comments>
|
||||
<comment name="multiLine" start="<!--" end="-->" region="comment"/>
|
||||
<comment name="multiLine" start="&startcomment;" end="&endcomment;" region="comment"/>
|
||||
</comments>
|
||||
</general>
|
||||
</language>
|
||||
<!-- kate: replace-tabs on; indent-width 2; tab-width 2; -->
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
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>
|
||||
<list name="keywords">
|
||||
<item>if</item>
|
||||
|
||||
1785
src/libs/3rdparty/syntax-highlighting/data/syntax/perl6.xml
vendored
Normal file
1785
src/libs/3rdparty/syntax-highlighting/data/syntax/perl6.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@@ -32,7 +32,6 @@
|
||||
#include <QCommandLineParser>
|
||||
#include <QCoreApplication>
|
||||
#include <QFile>
|
||||
#include <QVector>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include <QCoreApplication>
|
||||
#include <QFile>
|
||||
#include <QFileInfo>
|
||||
#include <QTextStream>
|
||||
#include <QVariant>
|
||||
#include <QXmlStreamReader>
|
||||
#include <QJsonDocument>
|
||||
@@ -59,6 +58,7 @@ QStringList readListing(const QString &fileName)
|
||||
if (xml.hasError()) {
|
||||
qWarning() << "XML error while reading" << fileName << " - "
|
||||
<< qPrintable(xml.errorString()) << "@ offset" << xml.characterOffset();
|
||||
listing.clear();
|
||||
}
|
||||
|
||||
return listing;
|
||||
@@ -69,7 +69,7 @@ QStringList readListing(const QString &fileName)
|
||||
* @param extensions extensions string to check
|
||||
* @return valid?
|
||||
*/
|
||||
bool checkExtensions(QString extensions)
|
||||
bool checkExtensions(const QString &extensions)
|
||||
{
|
||||
// get list of extensions
|
||||
const QStringList extensionParts = extensions.split(QLatin1Char(';'), QString::SkipEmptyParts);
|
||||
@@ -163,6 +163,7 @@ bool checkSingleChars(const QString &hlFilename, QXmlStreamReader &xml)
|
||||
const QString c = xml.attributes().value(QLatin1String("char")).toString();
|
||||
if (c.size() != 1) {
|
||||
qWarning() << hlFilename << "line" << xml.lineNumber() << "'char' must contain exactly one char:" << c;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -170,6 +171,7 @@ bool checkSingleChars(const QString &hlFilename, QXmlStreamReader &xml)
|
||||
const QString c = xml.attributes().value(QLatin1String("char1")).toString();
|
||||
if (c.size() != 1) {
|
||||
qWarning() << hlFilename << "line" << xml.lineNumber() << "'char1' must contain exactly one char:" << c;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -285,6 +287,7 @@ public:
|
||||
const QString name = xml.attributes().value(QLatin1String("name")).toString();
|
||||
if (m_existingNames.contains(name)) {
|
||||
qWarning() << m_filename << "list duplicate:" << name;
|
||||
m_success = false;
|
||||
}
|
||||
m_existingNames.insert(name);
|
||||
} else if (xml.name() == QLatin1String("keyword")) {
|
||||
@@ -296,7 +299,7 @@ public:
|
||||
|
||||
bool check() const
|
||||
{
|
||||
bool success = true;
|
||||
bool success = m_success;
|
||||
const auto invalidNames = m_usedNames - m_existingNames;
|
||||
if (!invalidNames.isEmpty()) {
|
||||
qWarning() << m_filename << "Reference of non-existing keyword list:" << invalidNames;
|
||||
@@ -306,6 +309,7 @@ public:
|
||||
const auto unusedNames = m_existingNames - m_usedNames;
|
||||
if (!unusedNames.isEmpty()) {
|
||||
qWarning() << m_filename << "Unused keyword lists:" << unusedNames;
|
||||
success = false;
|
||||
}
|
||||
|
||||
return success;
|
||||
@@ -315,14 +319,27 @@ private:
|
||||
QString m_filename;
|
||||
QSet<QString> m_usedNames;
|
||||
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
|
||||
{
|
||||
public:
|
||||
void setKateVersion(const QStringRef &verStr, const QString &hlFilename, const QString &hlName)
|
||||
{
|
||||
const auto idx = verStr.indexOf(QLatin1Char('.'));
|
||||
if (idx <= 0) {
|
||||
qWarning() << hlFilename << "invalid kateversion" << verStr;
|
||||
m_success = false;
|
||||
} else {
|
||||
auto &language = m_contextMap[hlName];
|
||||
language.version = {verStr.left(idx).toInt(), verStr.mid(idx + 1).toInt()};
|
||||
}
|
||||
}
|
||||
|
||||
void processElement(const QString &hlFilename, const QString &hlName, QXmlStreamReader &xml)
|
||||
{
|
||||
if (xml.name() == QLatin1String("context")) {
|
||||
@@ -336,22 +353,28 @@ public:
|
||||
|
||||
if (language.existingContextNames.contains(name)) {
|
||||
qWarning() << hlFilename << "Duplicate context:" << name;
|
||||
m_success = false;
|
||||
} else {
|
||||
language.existingContextNames.insert(name);
|
||||
}
|
||||
|
||||
if (xml.attributes().value(QLatin1String("fallthroughContext")).toString() == QLatin1String("#stay")) {
|
||||
qWarning() << hlFilename << "possible infinite loop due to fallthroughContext=\"#stay\" in context " << name;
|
||||
m_success = false;
|
||||
}
|
||||
|
||||
processContext(hlName, xml.attributes().value(QLatin1String("lineEndContext")).toString());
|
||||
processContext(hlName, xml.attributes().value(QLatin1String("lineEmptyContext")).toString());
|
||||
processContext(hlName, xml.attributes().value(QLatin1String("fallthroughContext")).toString());
|
||||
} else if (xml.name() == QLatin1String("include")) {
|
||||
// <include> tag inside <list>
|
||||
processVersion(hlFilename, hlName, xml, {5, 53}, QLatin1String("<include>"));
|
||||
} else {
|
||||
if (xml.attributes().hasAttribute(QLatin1String("context"))) {
|
||||
const QString context = xml.attributes().value(QLatin1String("context")).toString();
|
||||
if (context.isEmpty()) {
|
||||
qWarning() << hlFilename << "Missing context name in line" << xml.lineNumber();
|
||||
m_success = false;
|
||||
} else {
|
||||
processContext(hlName, context);
|
||||
}
|
||||
@@ -361,7 +384,30 @@ public:
|
||||
|
||||
bool check() const
|
||||
{
|
||||
bool success = true;
|
||||
bool success = m_success;
|
||||
|
||||
// recursive search for the required miximal version
|
||||
struct GetRequiredVersion
|
||||
{
|
||||
QHash<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) {
|
||||
const auto invalidContextNames = language.usedContextNames - language.existingContextNames;
|
||||
if (!invalidContextNames.isEmpty()) {
|
||||
@@ -374,6 +420,12 @@ public:
|
||||
qWarning() << language.hlFilename << "Unused contexts:" << unusedNames;
|
||||
success = false;
|
||||
}
|
||||
|
||||
auto requiredVersion = getRequiredVersion(m_contextMap, language);
|
||||
if (language.version < requiredVersion) {
|
||||
qWarning().nospace() << language.hlFilename << " depends on a language in version " << requiredVersion.majorRevision << "." << requiredVersion.minorRevision << ". Please, increase kateversion.";
|
||||
success = false;
|
||||
}
|
||||
}
|
||||
|
||||
return success;
|
||||
@@ -405,6 +457,7 @@ private:
|
||||
} else if (list.size() == 2) {
|
||||
// specific context of other language, e.g. Comment##ISO C++
|
||||
m_contextMap[list[1]].usedContextNames.insert(list[0]);
|
||||
m_contextMap[language].usedLanguageName.insert(list[1]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -418,6 +471,34 @@ private:
|
||||
}
|
||||
|
||||
private:
|
||||
struct Version
|
||||
{
|
||||
int majorRevision;
|
||||
int minorRevision;
|
||||
|
||||
Version(int majorRevision = 0, int minorRevision = 0)
|
||||
: majorRevision(majorRevision)
|
||||
, minorRevision(minorRevision)
|
||||
{}
|
||||
|
||||
bool operator<(const Version &version) const
|
||||
{
|
||||
return majorRevision < version.majorRevision || (majorRevision == version.majorRevision && minorRevision < version.minorRevision);
|
||||
}
|
||||
};
|
||||
|
||||
void processVersion(const QString &hlFilename, const QString &hlName, QXmlStreamReader &xml, Version const& requiredVersion, QLatin1String item)
|
||||
{
|
||||
auto &language = m_contextMap[hlName];
|
||||
|
||||
if (language.version < requiredVersion) {
|
||||
qWarning().nospace() << hlFilename << " " << item << " in line " << xml.lineNumber() << " is only available since version " << requiredVersion.majorRevision << "." << requiredVersion.minorRevision << ". Please, increase kateversion.";
|
||||
// update the version to cancel future warnings
|
||||
language.version = requiredVersion;
|
||||
m_success = false;
|
||||
}
|
||||
}
|
||||
|
||||
class Language
|
||||
{
|
||||
public:
|
||||
@@ -435,6 +516,12 @@ private:
|
||||
|
||||
// holds all existing context names
|
||||
QSet<QString> existingContextNames;
|
||||
|
||||
// holds all existing language names
|
||||
QSet<QString> usedLanguageName;
|
||||
|
||||
// kateversion language attribute
|
||||
Version version;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -442,6 +529,7 @@ private:
|
||||
* Example key: "Doxygen"
|
||||
*/
|
||||
QHash<QString, Language> m_contextMap;
|
||||
bool m_success = true;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -461,6 +549,7 @@ public:
|
||||
if (!name.isEmpty()) {
|
||||
if (m_existingAttributeNames.contains(name)) {
|
||||
qWarning() << m_filename << "itemData duplicate:" << name;
|
||||
m_success = false;
|
||||
} else {
|
||||
m_existingAttributeNames.insert(name);
|
||||
}
|
||||
@@ -469,6 +558,7 @@ public:
|
||||
const QString name = xml.attributes().value(QLatin1String("attribute")).toString();
|
||||
if (name.isEmpty()) {
|
||||
qWarning() << m_filename << "specified attribute is empty:" << xml.name();
|
||||
m_success = false;
|
||||
} else {
|
||||
m_usedAttributeNames.insert(name);
|
||||
}
|
||||
@@ -477,7 +567,7 @@ public:
|
||||
|
||||
bool check() const
|
||||
{
|
||||
bool success = true;
|
||||
bool success = m_success;
|
||||
const auto invalidNames = m_usedAttributeNames - m_existingAttributeNames;
|
||||
if (!invalidNames.isEmpty()) {
|
||||
qWarning() << m_filename << "Reference of non-existing itemData attributes:" << invalidNames;
|
||||
@@ -487,6 +577,7 @@ public:
|
||||
auto unusedNames = m_existingAttributeNames - m_usedAttributeNames;
|
||||
if (!unusedNames.isEmpty()) {
|
||||
qWarning() << m_filename << "Unused itemData:" << unusedNames;
|
||||
success = false;
|
||||
}
|
||||
|
||||
return success;
|
||||
@@ -496,6 +587,7 @@ private:
|
||||
QString m_filename;
|
||||
QSet<QString> m_usedAttributeNames;
|
||||
QSet<QString> m_existingAttributeNames;
|
||||
bool m_success = true;
|
||||
};
|
||||
|
||||
}
|
||||
@@ -594,8 +686,11 @@ int main(int argc, char *argv[])
|
||||
|
||||
AttributeChecker attributeChecker(hlFilename);
|
||||
KeywordChecker keywordChecker(hlFilename);
|
||||
|
||||
const QString hlName = hl[QStringLiteral("name")].toString();
|
||||
|
||||
contextChecker.setKateVersion(xml.attributes().value(QStringLiteral("kateversion")), hlFilename, hlName);
|
||||
|
||||
// scan for broken regex or keywords with spaces
|
||||
while (!xml.atEnd()) {
|
||||
xml.readNext();
|
||||
|
||||
@@ -69,6 +69,8 @@ if(BUILD_QCH)
|
||||
LINK_QCHS
|
||||
Qt5Core_QCH
|
||||
Qt5Gui_QCH
|
||||
INCLUDE_DIRS
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
BLANK_MACROS
|
||||
KSYNTAXHIGHLIGHTING_EXPORT
|
||||
KSYNTAXHIGHLIGHTING_DEPRECATED
|
||||
|
||||
@@ -61,10 +61,8 @@ void Context::load(QXmlStreamReader& reader)
|
||||
m_attribute = reader.attributes().value(QStringLiteral("attribute")).toString();
|
||||
m_lineEndContext.parse(reader.attributes().value(QStringLiteral("lineEndContext")));
|
||||
m_lineEmptyContext.parse(reader.attributes().value(QStringLiteral("lineEmptyContext")));
|
||||
m_fallthrough = Xml::attrToBool(reader.attributes().value(QStringLiteral("fallthrough")));
|
||||
m_fallthroughContext.parse(reader.attributes().value(QStringLiteral("fallthroughContext")));
|
||||
if (m_fallthroughContext.isStay())
|
||||
m_fallthrough = false;
|
||||
m_fallthrough = !m_fallthroughContext.isStay();
|
||||
m_noIndentationBasedFolding = Xml::attrToBool(reader.attributes().value(QStringLiteral("noIndentationBasedFolding")));
|
||||
|
||||
reader.readNext();
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
#include "xml_p.h"
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QDebug>
|
||||
#include <QFile>
|
||||
#include <QHash>
|
||||
#include <QJsonObject>
|
||||
@@ -234,6 +233,19 @@ QStringList Definition::keywordList(const QString& name) const
|
||||
return list ? list->keywords() : QStringList();
|
||||
}
|
||||
|
||||
bool Definition::setKeywordList(const QString& name, const QStringList& content)
|
||||
{
|
||||
d->load(DefinitionData::OnlyKeywords(true));
|
||||
KeywordList* list = d->keywordList(name);
|
||||
if (list)
|
||||
{
|
||||
list->setKeywordList(content);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
QVector<Format> Definition::formats() const
|
||||
{
|
||||
d->load();
|
||||
|
||||
@@ -26,9 +26,8 @@
|
||||
|
||||
#include "ksyntaxhighlighting_export.h"
|
||||
|
||||
#include <QTypeInfo>
|
||||
#include <QPair>
|
||||
|
||||
#include <QVector>
|
||||
#include <memory>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
@@ -329,10 +328,28 @@ public:
|
||||
/**
|
||||
* Returns the list of keywords for the keyword list @p name.
|
||||
* @since 5.49
|
||||
* @see keywordLists()
|
||||
* @see keywordLists(), setKeywordList()
|
||||
*/
|
||||
QStringList keywordList(const QString& name) const;
|
||||
|
||||
/**
|
||||
* Set the contents of the keyword list @p name to @p content.
|
||||
* Only existing keywordLists() can be changed. For non-existent keyword lists,
|
||||
* false is returned.
|
||||
*
|
||||
* Whenever you change a keyword list, make sure to trigger a rehighlight of
|
||||
* your documents. In case you are using QSyntaxHighlighter via SyntaxHighlighter,
|
||||
* this can be done by calling SyntaxHighlighter::rehighlight().
|
||||
*
|
||||
* @note In general, changing keyword lists via setKeywordList() is discouraged,
|
||||
* since if a keyword list name in the syntax highlighting definition
|
||||
* file changes, the call setKeywordList() may suddenly fail.
|
||||
*
|
||||
* @see keywordList(), keywordLists()
|
||||
* @since 5.62
|
||||
*/
|
||||
bool setKeywordList(const QString& name, const QStringList& content);
|
||||
|
||||
/**
|
||||
* Returns a list of all Format items used by this definition.
|
||||
* The order of the Format items equals the order of the itemDatas in the xml file.
|
||||
|
||||
@@ -101,7 +101,7 @@ public:
|
||||
QVector<QPair<QChar, QString>> characterEncodings;
|
||||
|
||||
QString fileName;
|
||||
QString name = QStringLiteral(QT_TRANSLATE_NOOP("Syntax highlighting", "None"));
|
||||
QString name = QStringLiteral(QT_TRANSLATE_NOOP("Language", "None"));
|
||||
QString section;
|
||||
QString style;
|
||||
QString indenter;
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
#include "ksyntaxhighlighting_logging.h"
|
||||
#include "ksyntaxhighlighting_version.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QNetworkAccessManager>
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
#include "xml_p.h"
|
||||
|
||||
#include <QColor>
|
||||
#include <QDebug>
|
||||
#include <QMetaEnum>
|
||||
#include <QXmlStreamReader>
|
||||
|
||||
@@ -207,6 +206,46 @@ bool Format::spellCheck() const
|
||||
return d->spellCheck;
|
||||
}
|
||||
|
||||
bool Format::hasBoldOverride() const
|
||||
{
|
||||
return d->style.hasBold;
|
||||
}
|
||||
|
||||
bool Format::hasItalicOverride() const
|
||||
{
|
||||
return d->style.hasItalic;
|
||||
}
|
||||
|
||||
bool Format::hasUnderlineOverride() const
|
||||
{
|
||||
return d->style.hasUnderline;
|
||||
}
|
||||
|
||||
bool Format::hasStrikeThroughOverride() const
|
||||
{
|
||||
return d->style.hasStrikeThrough;
|
||||
}
|
||||
|
||||
bool Format::hasTextColorOverride() const
|
||||
{
|
||||
return d->style.textColor;
|
||||
}
|
||||
|
||||
bool Format::hasBackgroundColorOverride() const
|
||||
{
|
||||
return d->style.backgroundColor;
|
||||
}
|
||||
|
||||
bool Format::hasSelectedTextColorOverride() const
|
||||
{
|
||||
return d->style.selectedTextColor;
|
||||
}
|
||||
|
||||
bool Format::hasSelectedBackgroundColorOverride() const
|
||||
{
|
||||
return d->style.selectedBackgroundColor;
|
||||
}
|
||||
|
||||
|
||||
void FormatPrivate::load(QXmlStreamReader& reader)
|
||||
{
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
#include "theme.h"
|
||||
|
||||
#include <QExplicitlySharedDataPointer>
|
||||
#include <QTypeInfo>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QColor;
|
||||
@@ -139,6 +138,70 @@ public:
|
||||
*/
|
||||
bool spellCheck() const;
|
||||
|
||||
/** Returns @c true if the syntax definition file sets a value for the bold text
|
||||
* attribute and, therefore, overrides the theme and the default formatting
|
||||
* style. If the return is @p true, this value is obtained by isBold().
|
||||
* @see isBold()
|
||||
* @since 5.62
|
||||
*/
|
||||
bool hasBoldOverride() const;
|
||||
|
||||
/** Returns @c true if the syntax definition file sets a value for the italic text
|
||||
* attribute and, therefore, overrides the theme and the default formatting style.
|
||||
* If the return is @p true, this value is obtained by isItalic().
|
||||
* @see isItalic()
|
||||
* @since 5.62
|
||||
*/
|
||||
bool hasItalicOverride() const;
|
||||
|
||||
/** Returns @c true if the syntax definition file sets a value for the underlined
|
||||
* text attribute and, therefore, overrides the theme and the default formatting
|
||||
* style. If the return is @p true, this value is obtained by isUnderline().
|
||||
* @see isUnderline()
|
||||
* @since 5.62
|
||||
*/
|
||||
bool hasUnderlineOverride() const;
|
||||
|
||||
/** Returns @c true if the syntax definition file specifies a value for the
|
||||
* struck through text attribute. If the return is @p true, this value
|
||||
* is obtained by isStrikeThrough().
|
||||
* @see isStrikeThrough()
|
||||
* @since 5.62
|
||||
*/
|
||||
bool hasStrikeThroughOverride() const;
|
||||
|
||||
/** Returns @c true if the syntax definition file sets a value for the foreground
|
||||
* text color attribute and, therefore, overrides the theme and the default formatting
|
||||
* style. If the return is @p true, this value is obtained by textColor().
|
||||
* @see textColor(), hasTextColor()
|
||||
* @since 5.62
|
||||
*/
|
||||
bool hasTextColorOverride() const;
|
||||
|
||||
/** Returns @c true if the syntax definition file sets a value for the background
|
||||
* color attribute and, therefore, overrides the theme and the default formatting
|
||||
* style. If the return is @p true, this value is obtained by backgroundColor().
|
||||
* @see backgroundColor(), hasBackgroundColor()
|
||||
* @since 5.62
|
||||
*/
|
||||
bool hasBackgroundColorOverride() const;
|
||||
|
||||
/** Returns @c true if the syntax definition file specifies a value for the
|
||||
* selected text color attribute. If the return is @p true, this value is
|
||||
* obtained by selectedTextColor().
|
||||
* @see selectedTextColor()
|
||||
* @since 5.62
|
||||
*/
|
||||
bool hasSelectedTextColorOverride() const;
|
||||
|
||||
/** Returns @c true if the syntax definition file specifies a value for the
|
||||
* selected background color attribute. If the return is @p true, this
|
||||
* value is obtained by selectedBackgroundColor().
|
||||
* @see selectedBackgroundColor()
|
||||
* @since 5.62
|
||||
*/
|
||||
bool hasSelectedBackgroundColorOverride() const;
|
||||
|
||||
private:
|
||||
friend class FormatPrivate;
|
||||
QExplicitlySharedDataPointer<FormatPrivate> d;
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
#include "theme.h"
|
||||
#include "ksyntaxhighlighting_logging.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QFile>
|
||||
#include <QFileInfo>
|
||||
#include <QTextStream>
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include "definition_p.h"
|
||||
#include "ksyntaxhighlighting_logging.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QXmlStreamReader>
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
@@ -24,9 +24,8 @@
|
||||
#ifndef KSYNTAXHIGHLIGHTING_KEYWORDLIST_P_H
|
||||
#define KSYNTAXHIGHLIGHTING_KEYWORDLIST_P_H
|
||||
|
||||
#include <QSet>
|
||||
#include <QString>
|
||||
#include <QVector>
|
||||
#include <QStringList>
|
||||
|
||||
#include <vector>
|
||||
|
||||
@@ -60,6 +59,14 @@ public:
|
||||
return m_keywords;
|
||||
}
|
||||
|
||||
void setKeywordList(const QStringList& keywords)
|
||||
{
|
||||
m_keywords = keywords;
|
||||
m_keywordsSortedCaseSensitive.clear();
|
||||
m_keywordsSortedCaseInsensitive.clear();
|
||||
initLookupForCaseSensitivity(m_caseSensitive);
|
||||
}
|
||||
|
||||
/** Checks if @p str is a keyword in this list. */
|
||||
bool contains(const QStringRef &str) const
|
||||
{
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
#include "ksyntaxhighlighting_logging.h"
|
||||
#include "wildcardmatcher_p.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QDirIterator>
|
||||
#include <QFile>
|
||||
#include <QFileInfo>
|
||||
|
||||
@@ -101,9 +101,6 @@ Definition Rule::definition() const
|
||||
void Rule::setDefinition(const Definition &def)
|
||||
{
|
||||
m_def = def;
|
||||
|
||||
// cache for DefinitionData::wordDelimiters, is accessed VERY often
|
||||
m_wordDelimiter = &DefinitionData::get(m_def.definition())->wordDelimiters;
|
||||
}
|
||||
|
||||
bool Rule::load(QXmlStreamReader &reader)
|
||||
@@ -140,6 +137,9 @@ bool Rule::load(QXmlStreamReader &reader)
|
||||
void Rule::resolveContext()
|
||||
{
|
||||
m_context.resolve(m_def.definition());
|
||||
|
||||
// cache for DefinitionData::wordDelimiters, is accessed VERY often
|
||||
m_wordDelimiter = &DefinitionData::get(m_def.definition())->wordDelimiters;
|
||||
}
|
||||
|
||||
void Rule::resolveAttributeFormat(Context *lookupContext)
|
||||
@@ -612,8 +612,10 @@ MatchResult RegExpr::doMatch(const QString& text, int offset, const QStringList
|
||||
|
||||
/**
|
||||
* no match
|
||||
* the pattern of a dynamic regex depends on the previous contexts
|
||||
* so that skipOffset cannot be computed
|
||||
*/
|
||||
return MatchResult(offset, result.capturedStart());
|
||||
return MatchResult(offset, m_dynamic ? 0 : result.capturedStart());
|
||||
}
|
||||
|
||||
|
||||
@@ -650,13 +652,17 @@ MatchResult WordDetect::doMatch(const QString& text, int offset, const QStringLi
|
||||
if (text.size() - offset < m_word.size())
|
||||
return offset;
|
||||
|
||||
if (offset > 0 && !isWordDelimiter(text.at(offset - 1)))
|
||||
/**
|
||||
* detect delimiter characters on the inner and outer boundaries of the string
|
||||
* NOTE: m_word isn't empty
|
||||
*/
|
||||
if (offset > 0 && !isWordDelimiter(text.at(offset - 1)) && !isWordDelimiter(text.at(offset)))
|
||||
return offset;
|
||||
|
||||
if (text.midRef(offset, m_word.size()).compare(m_word, m_caseSensitivity) != 0)
|
||||
return offset;
|
||||
|
||||
if (text.size() == offset + m_word.size() || isWordDelimiter(text.at(offset + m_word.size())))
|
||||
if (text.size() == offset + m_word.size() || isWordDelimiter(text.at(offset + m_word.size())) || isWordDelimiter(text.at(offset + m_word.size() - 1)))
|
||||
return offset + m_word.size();
|
||||
|
||||
return offset;
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
|
||||
#include <QRegularExpression>
|
||||
#include <QString>
|
||||
#include <QVector>
|
||||
|
||||
#include <memory>
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
#include "ksyntaxhighlighting_export.h"
|
||||
|
||||
#include <QExplicitlySharedDataPointer>
|
||||
#include <QTypeInfo>
|
||||
|
||||
namespace KSyntaxHighlighting {
|
||||
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
#include "state.h"
|
||||
#include "theme.h"
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
Q_DECLARE_METATYPE(QTextBlock)
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#ifndef KSYNTAXHIGHLIGHTING_TEXTSTYLEDATA_P_H
|
||||
#define KSYNTAXHIGHLIGHTING_TEXTSTYLEDATA_P_H
|
||||
|
||||
#include <QColor>
|
||||
|
||||
namespace KSyntaxHighlighting {
|
||||
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
#include <QJsonValue>
|
||||
#include <QMetaEnum>
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
using namespace KSyntaxHighlighting;
|
||||
|
||||
|
||||
@@ -251,7 +251,7 @@ public:
|
||||
QdbDeviceWizard(QWidget *parent)
|
||||
: QWizard(parent)
|
||||
{
|
||||
setWindowTitle(QdbDeviceWizard::tr("Boot2Qt Network Device Setup"));
|
||||
setWindowTitle(QdbDevice::tr("Boot2Qt Network Device Setup"));
|
||||
settingsPage.setCommitPage(true);
|
||||
|
||||
enum { SettingsPageId };
|
||||
|
||||
@@ -34,6 +34,8 @@ namespace Internal {
|
||||
|
||||
class QdbDevice : public RemoteLinux::LinuxDevice
|
||||
{
|
||||
Q_DECLARE_TR_FUNCTIONS(Qdb::Internal::QdbDevice)
|
||||
|
||||
public:
|
||||
typedef QSharedPointer<QdbDevice> Ptr;
|
||||
typedef QSharedPointer<const QdbDevice> ConstPtr;
|
||||
|
||||
@@ -106,7 +106,7 @@ void ConfigModelItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *
|
||||
if (data.type == ConfigModel::DataItem::FILE || data.type == ConfigModel::DataItem::DIRECTORY) {
|
||||
auto edit = static_cast<Utils::PathChooser *>(editor);
|
||||
if (edit->rawPath() != data.value)
|
||||
model->setData(index, edit->fileName().toUserOutput(), Qt::EditRole);
|
||||
model->setData(index, edit->fileName().toString(), Qt::EditRole);
|
||||
return;
|
||||
} else if (!data.values.isEmpty()) {
|
||||
auto edit = static_cast<QComboBox *>(editor);
|
||||
|
||||
@@ -39,6 +39,7 @@ namespace Internal {
|
||||
|
||||
class CtfStatisticsModel : public QAbstractTableModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
enum Role {
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -99,8 +99,7 @@ GenericProjectPluginPrivate::GenericProjectPluginPrivate()
|
||||
genericProject->editFilesTriggered();
|
||||
});
|
||||
|
||||
|
||||
const auto removeDirAction = new QAction(tr("Remove Directory"), this);
|
||||
const auto removeDirAction = new QAction(GenericProjectPlugin::tr("Remove Directory"), this);
|
||||
Command * const cmd = ActionManager::registerAction(removeDirAction, "GenericProject.RemoveDir",
|
||||
Context(PEC::C_PROJECT_TREE));
|
||||
ActionManager::actionContainer(PEC::M_FOLDERCONTEXT)->addAction(cmd, PEC::G_FOLDER_OTHER);
|
||||
|
||||
@@ -1165,7 +1165,7 @@ void DocumentContainer::findText(const QString &text,
|
||||
return Selection::Element{e.element, e.index, fm.size(0, text.left(e.index)).width()};
|
||||
};
|
||||
|
||||
QString term = text;
|
||||
QString term = QRegularExpression::escape(text);
|
||||
if (flags & QTextDocument::FindWholeWords)
|
||||
term = QString("\\b%1\\b").arg(term);
|
||||
const QRegularExpression::PatternOptions patternOptions
|
||||
|
||||
@@ -79,14 +79,14 @@ public:
|
||||
: BuildStepConfigWidget(buildStep), m_buildStep(buildStep)
|
||||
{
|
||||
auto buildArgumentsLabel = new QLabel(this);
|
||||
buildArgumentsLabel->setText(tr("Base arguments:"));
|
||||
buildArgumentsLabel->setText(IosBuildStep::tr("Base arguments:"));
|
||||
|
||||
m_buildArgumentsTextEdit = new QPlainTextEdit(this);
|
||||
m_buildArgumentsTextEdit->setPlainText(QtcProcess::joinArgs(m_buildStep->baseArguments()));
|
||||
|
||||
m_resetDefaultsButton = new QPushButton(this);
|
||||
m_resetDefaultsButton->setLayoutDirection(Qt::RightToLeft);
|
||||
m_resetDefaultsButton->setText(tr("Reset Defaults"));
|
||||
m_resetDefaultsButton->setText(IosBuildStep::tr("Reset Defaults"));
|
||||
m_resetDefaultsButton->setEnabled(!m_buildStep->m_useDefaultArguments);
|
||||
|
||||
auto extraArgumentsLabel = new QLabel(this);
|
||||
@@ -101,9 +101,9 @@ public:
|
||||
gridLayout->addWidget(extraArgumentsLabel, 2, 0, 1, 1);
|
||||
gridLayout->addWidget(m_extraArgumentsLineEdit, 2, 1, 1, 1);
|
||||
|
||||
extraArgumentsLabel->setText(tr("Extra arguments:"));
|
||||
extraArgumentsLabel->setText(IosBuildStep::tr("Extra arguments:"));
|
||||
|
||||
setDisplayName(tr("iOS build", "iOS BuildStep display name."));
|
||||
setDisplayName(IosBuildStep::tr("iOS build", "iOS BuildStep display name."));
|
||||
|
||||
updateDetails();
|
||||
|
||||
|
||||
@@ -377,7 +377,7 @@ void Client::activateDocument(TextEditor::TextDocument *document)
|
||||
for (Core::IEditor *editor : Core::DocumentModel::editorsForDocument(document)) {
|
||||
updateEditorToolBar(editor);
|
||||
if (auto textEditor = qobject_cast<TextEditor::BaseTextEditor *>(editor))
|
||||
textEditor->editorWidget()->addHoverHandler(hoverHandler());
|
||||
textEditor->editorWidget()->addHoverHandler(&m_hoverHandler);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -387,6 +387,10 @@ void Client::deactivateDocument(TextEditor::TextDocument *document)
|
||||
resetAssistProviders(document);
|
||||
if (TextEditor::SyntaxHighlighter *highlighter = document->syntaxHighlighter())
|
||||
highlighter->clearAllExtraFormats();
|
||||
for (Core::IEditor *editor : Core::DocumentModel::editorsForDocument(document)) {
|
||||
if (auto textEditor = qobject_cast<TextEditor::BaseTextEditor *>(editor))
|
||||
textEditor->editorWidget()->removeHoverHandler(&m_hoverHandler);
|
||||
}
|
||||
}
|
||||
|
||||
bool Client::documentOpen(TextEditor::TextDocument *document) const
|
||||
|
||||
@@ -34,6 +34,7 @@ const char DEVICE_ID[] = "McuSupport.Device";
|
||||
const char MCUSUPPORT_QT_VERSION[] = "Qt4ProjectManager.QtVersion.McuSupport";
|
||||
const char RUNCONFIGURATION[] = "McuSupport.RunConfiguration";
|
||||
const char SETTINGS_ID[] = "CC.McuSupport.Configuration";
|
||||
const char KIT_BOARD_VENDOR_KEY[] = "McuSupport.BoardVendor";
|
||||
const char KIT_BOARD_MODEL_KEY[] = "McuSupport.BoardModel";
|
||||
|
||||
const char ENVVAR_ARMGCC_DIR[] = "ARMGCC_DIR";
|
||||
|
||||
@@ -198,10 +198,13 @@ void PackageOptions::updateStatus()
|
||||
m_statusLabel->setText(statusText);
|
||||
}
|
||||
|
||||
BoardOptions::BoardOptions(const QString &model, const QString &toolChainFileName,
|
||||
BoardOptions::BoardOptions(const QString &vendor, const QString &model,
|
||||
const QString &toolChainFileName, const QString &qulPlatform,
|
||||
const QVector<PackageOptions*> &packages)
|
||||
: m_model(model)
|
||||
: m_vendor(vendor)
|
||||
, m_model(model)
|
||||
, m_toolChainFile(toolChainFileName)
|
||||
, m_qulPlatform(qulPlatform)
|
||||
, m_packages(packages)
|
||||
{
|
||||
}
|
||||
@@ -216,11 +219,21 @@ QString BoardOptions::toolChainFile() const
|
||||
return m_toolChainFile;
|
||||
}
|
||||
|
||||
QString BoardOptions::qulPlatform() const
|
||||
{
|
||||
return m_qulPlatform;
|
||||
}
|
||||
|
||||
QVector<PackageOptions *> BoardOptions::packages() const
|
||||
{
|
||||
return m_packages;
|
||||
}
|
||||
|
||||
QString BoardOptions::vendor() const
|
||||
{
|
||||
return m_vendor;
|
||||
}
|
||||
|
||||
static PackageOptions *createQulPackage()
|
||||
{
|
||||
auto result = new PackageOptions(
|
||||
@@ -313,7 +326,8 @@ static PackageOptions *createSeggerJLinkPackage()
|
||||
{
|
||||
const QString defaultPath =
|
||||
Utils::HostOsInfo::isWindowsHost() ?
|
||||
QDir::fromNativeSeparators(qEnvironmentVariable("ProgramFiles")) + "/SEGGER/JLink"
|
||||
QDir::fromNativeSeparators(qEnvironmentVariable("ProgramFiles(x86)"))
|
||||
+ "/SEGGER/JLink"
|
||||
: QString("%{Env:SEGGER_JLINK_SOFTWARE_AND_DOCUMENTATION_PATH}");
|
||||
auto result = new PackageOptions(
|
||||
PackageOptions::tr("SEGGER JLink"),
|
||||
@@ -342,15 +356,21 @@ McuSupportOptions::McuSupportOptions(QObject *parent)
|
||||
qulPackage};
|
||||
auto nxpPackages = {armGccPackage, evkbImxrt1050SdkPackage, seggerJLinkPackage,
|
||||
qulPackage};
|
||||
auto desktopPackages = {qulPackage};
|
||||
packages = {armGccPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage,
|
||||
evkbImxrt1050SdkPackage, seggerJLinkPackage, qulPackage};
|
||||
|
||||
boards.append(new BoardOptions(
|
||||
"stm32f7508", "CMake/stm32f7508-discovery.cmake", stmPackages));
|
||||
boards.append(new BoardOptions(
|
||||
"stm32f769i", "CMake/stm32f769i-discovery.cmake", stmPackages));
|
||||
boards.append(new BoardOptions(
|
||||
"evkbimxrt1050", "CMake/evkbimxrt1050-toolchain.cmake", nxpPackages));
|
||||
const QString vendorStm = "STM";
|
||||
const QString vendorNxp = "NXP";
|
||||
const QString vendorQt = "Qt";
|
||||
boards.append(new BoardOptions(vendorStm,
|
||||
"stm32f7508", "CMake/stm32f7508-discovery.cmake", "", stmPackages));
|
||||
boards.append(new BoardOptions(vendorStm,
|
||||
"stm32f769i", "CMake/stm32f769i-discovery.cmake", "", stmPackages));
|
||||
boards.append(new BoardOptions(vendorNxp,
|
||||
"evkbimxrt1050", "CMake/evkbimxrt1050-toolchain.cmake", "", nxpPackages));
|
||||
boards.append(new BoardOptions(vendorQt,
|
||||
"Desktop", "", "Qt", desktopPackages));
|
||||
|
||||
for (auto package : packages)
|
||||
connect(package, &PackageOptions::changed, [this](){
|
||||
@@ -400,18 +420,25 @@ static ProjectExplorer::ToolChain* armGccToolchain(const Utils::FilePath &path,
|
||||
return toolChain;
|
||||
}
|
||||
|
||||
static bool isDesktop(const BoardOptions* board)
|
||||
{
|
||||
return board->qulPlatform() == "Qt";
|
||||
}
|
||||
|
||||
static void setKitProperties(ProjectExplorer::Kit *k, const BoardOptions* board)
|
||||
{
|
||||
using namespace ProjectExplorer;
|
||||
|
||||
k->setUnexpandedDisplayName("QtMCU - " + board->model());
|
||||
k->setValue(Constants::KIT_BOARD_VENDOR_KEY, board->vendor());
|
||||
k->setValue(Constants::KIT_BOARD_MODEL_KEY, board->model());
|
||||
k->setAutoDetected(false);
|
||||
k->setIrrelevantAspects({
|
||||
SysRootKitAspect::id(),
|
||||
if (!isDesktop(board)) {
|
||||
k->setIrrelevantAspects({SysRootKitAspect::id(),
|
||||
"QtSupport.QtInformation" // QtKitAspect::id()
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
static void setKitToolchains(ProjectExplorer::Kit *k, const QString &armGccPath)
|
||||
{
|
||||
@@ -483,9 +510,18 @@ static void setKitCMakeOptions(ProjectExplorer::Kit *k, const BoardOptions* boar
|
||||
using namespace CMakeProjectManager;
|
||||
|
||||
CMakeConfig config = CMakeConfigurationKitAspect::configuration(k);
|
||||
if (!board->toolChainFile().isEmpty())
|
||||
config.append(CMakeConfigItem("CMAKE_TOOLCHAIN_FILE",
|
||||
("%{CurrentBuild:Env:Qul_DIR}/" +
|
||||
board->toolChainFile()).toUtf8()));
|
||||
if (!board->qulPlatform().isEmpty())
|
||||
config.append(CMakeConfigItem("QUL_PLATFORM",
|
||||
board->qulPlatform().toUtf8()));
|
||||
if (isDesktop(board)) {
|
||||
config.append(CMakeConfigItem("CMAKE_PREFIX_PATH", "%{Qt:QT_INSTALL_PREFIX}"));
|
||||
// TODO: Hack! Implement color depth variants of all targets
|
||||
config.append(CMakeConfigItem("QUL_COLOR_DEPTH", "32"));
|
||||
}
|
||||
CMakeConfigurationKitAspect::setConfiguration(k, config);
|
||||
if (Utils::HostOsInfo::isWindowsHost())
|
||||
CMakeGeneratorKitAspect::setGenerator(k, "NMake Makefiles JOM");
|
||||
@@ -504,9 +540,11 @@ ProjectExplorer::Kit *McuSupportOptions::kit(const BoardOptions* board)
|
||||
KitGuard kitGuard(k);
|
||||
|
||||
setKitProperties(k, board);
|
||||
if (!isDesktop(board)) {
|
||||
setKitToolchains(k, armGccPath);
|
||||
setKitDebugger(k, armGccPath);
|
||||
setKitDevice(k);
|
||||
}
|
||||
setKitEnvironment(k, board);
|
||||
setKitCMakeOptions(k, board);
|
||||
|
||||
|
||||
@@ -101,16 +101,20 @@ class BoardOptions : public QObject
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
BoardOptions(const QString &model, const QString &toolChainFile,
|
||||
const QVector<PackageOptions *> &packages);
|
||||
BoardOptions(const QString &vendor, const QString &model, const QString &toolChainFile,
|
||||
const QString &qulPlatform, const QVector<PackageOptions *> &packages);
|
||||
|
||||
QString vendor() const;
|
||||
QString model() const;
|
||||
QString toolChainFile() const;
|
||||
QString qulPlatform() const;
|
||||
QVector<PackageOptions *> packages() const;
|
||||
|
||||
private:
|
||||
const QString m_vendor;
|
||||
const QString m_model;
|
||||
const QString m_toolChainFile;
|
||||
const QString m_qulPlatform;
|
||||
const QVector<PackageOptions*> m_packages;
|
||||
};
|
||||
|
||||
|
||||
@@ -108,14 +108,14 @@ void McuSupportOptionsWidget::updateStatus()
|
||||
{
|
||||
const QVector<BoardOptions*> validBoards = m_options->validBoards();
|
||||
m_statusLabel->setText(validBoards.isEmpty()
|
||||
? McuSupportOptionsPage::tr("No devices and kits can currently be generated. "
|
||||
"Select a board and provide the package paths. "
|
||||
"Afterwards, press Apply to generate device and kit for "
|
||||
? McuSupportOptionsPage::tr("No kits can currently be generated. "
|
||||
"Select a target and provide the package paths. "
|
||||
"Afterwards, press Apply to generate a kit for "
|
||||
"your board.")
|
||||
: McuSupportOptionsPage::tr("Devices and kits for the following boards can be generated: "
|
||||
: McuSupportOptionsPage::tr("Kits for the following targets can be generated: "
|
||||
"%1 "
|
||||
"Press Apply to generate device and kit for "
|
||||
"your board.").arg(ulOfBoardModels(validBoards)));
|
||||
"Press Apply to generate a kit for "
|
||||
"your target.").arg(ulOfBoardModels(validBoards)));
|
||||
}
|
||||
|
||||
void McuSupportOptionsWidget::showBoardPackages(int boardIndex)
|
||||
|
||||
@@ -49,24 +49,26 @@ static CommandLine flashAndRunCommand(Target *target)
|
||||
const CMakeProjectManager::CMakeTool *tool =
|
||||
CMakeProjectManager::CMakeKitAspect::cmakeTool(target->kit());
|
||||
|
||||
// TODO: Hack! Implement flash target name handling, properly
|
||||
const QString targetName =
|
||||
target->kit()->value(Constants::KIT_BOARD_VENDOR_KEY).toString() == "NXP"
|
||||
? QString("flash_%1").arg(projectName)
|
||||
: QString("flash_%1_and_bootloader").arg(projectName);
|
||||
|
||||
return CommandLine(tool->filePath(), {
|
||||
"--build",
|
||||
".",
|
||||
"--target",
|
||||
QString("flash_%1_and_bootloader").arg(projectName)
|
||||
targetName
|
||||
});
|
||||
}
|
||||
|
||||
class FlashAndRunConfiguration : public ProjectExplorer::RunConfiguration
|
||||
{
|
||||
public:
|
||||
FlashAndRunConfiguration(Target *target, Core::Id id)
|
||||
FlashAndRunConfiguration::FlashAndRunConfiguration(Target *target, Core::Id id)
|
||||
: RunConfiguration(target, id)
|
||||
{
|
||||
auto effectiveFlashAndRunCall = addAspect<BaseStringAspect>();
|
||||
effectiveFlashAndRunCall->setLabelText(tr("Effective flash and run call:"));
|
||||
effectiveFlashAndRunCall->setDisplayStyle(BaseStringAspect::TextEditDisplay);
|
||||
effectiveFlashAndRunCall->setReadOnly(true);
|
||||
|
||||
auto updateConfiguration = [target, effectiveFlashAndRunCall] {
|
||||
effectiveFlashAndRunCall->setValue(flashAndRunCommand(target).toUserOutput());
|
||||
@@ -74,12 +76,12 @@ public:
|
||||
|
||||
updateConfiguration();
|
||||
|
||||
connect(target->activeBuildConfiguration(), &BuildConfiguration::buildDirectoryChanged,
|
||||
this, updateConfiguration);
|
||||
connect(target->project(), &Project::displayNameChanged,
|
||||
this, updateConfiguration);
|
||||
connect(target->activeBuildConfiguration(),
|
||||
&BuildConfiguration::buildDirectoryChanged,
|
||||
this,
|
||||
updateConfiguration);
|
||||
connect(target->project(), &Project::displayNameChanged, this, updateConfiguration);
|
||||
}
|
||||
};
|
||||
|
||||
class FlashAndRunWorker : public SimpleTargetRunner
|
||||
{
|
||||
|
||||
@@ -37,6 +37,14 @@ public:
|
||||
EmrunRunConfigurationFactory();
|
||||
};
|
||||
|
||||
class FlashAndRunConfiguration : public ProjectExplorer::RunConfiguration
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
FlashAndRunConfiguration(ProjectExplorer::Target *target, Core::Id id);
|
||||
};
|
||||
|
||||
ProjectExplorer::RunWorkerFactory::WorkerCreator makeFlashAndRunWorker();
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
@@ -73,12 +73,20 @@ void EnvironmentAspect::setUserEnvironmentChanges(const Utils::EnvironmentItems
|
||||
|
||||
Utils::Environment EnvironmentAspect::environment() const
|
||||
{
|
||||
QTC_ASSERT(m_base >= 0 && m_base < m_baseEnvironments.size(), return Environment());
|
||||
Environment env = baseEnvironment();
|
||||
Environment env = modifiedBaseEnvironment();
|
||||
env.modify(m_userChanges);
|
||||
return env;
|
||||
}
|
||||
|
||||
Environment EnvironmentAspect::modifiedBaseEnvironment() const
|
||||
{
|
||||
QTC_ASSERT(m_base >= 0 && m_base < m_baseEnvironments.size(), return Environment());
|
||||
Environment env = m_baseEnvironments.at(m_base).unmodifiedBaseEnvironment();
|
||||
for (const EnvironmentModifier &modifier : m_modifiers)
|
||||
modifier(env);
|
||||
return env;
|
||||
}
|
||||
|
||||
const QStringList EnvironmentAspect::displayNames() const
|
||||
{
|
||||
return Utils::transform(m_baseEnvironments, &BaseEnvironment::displayName);
|
||||
@@ -122,15 +130,6 @@ void EnvironmentAspect::toMap(QVariantMap &data) const
|
||||
data.insert(QLatin1String(CHANGES_KEY), Utils::EnvironmentItem::toStringList(m_userChanges));
|
||||
}
|
||||
|
||||
Environment EnvironmentAspect::baseEnvironment() const
|
||||
{
|
||||
QTC_ASSERT(m_base >= 0 && m_base < m_baseEnvironments.size(), return Environment());
|
||||
Environment env = m_baseEnvironments.at(m_base).unmodifiedBaseEnvironment();
|
||||
for (const EnvironmentModifier &modifier : m_modifiers)
|
||||
modifier(env);
|
||||
return env;
|
||||
}
|
||||
|
||||
QString EnvironmentAspect::currentDisplayName() const
|
||||
{
|
||||
QTC_ASSERT(m_base >= 0 && m_base < m_baseEnvironments.size(), return {});
|
||||
|
||||
@@ -46,6 +46,9 @@ public:
|
||||
// The environment including the user's modifications.
|
||||
Utils::Environment environment() const;
|
||||
|
||||
// Environment including modifiers, but without explicit user changes.
|
||||
Utils::Environment modifiedBaseEnvironment() const;
|
||||
|
||||
int baseEnvironmentBase() const;
|
||||
void setBaseEnvironmentBase(int base);
|
||||
|
||||
@@ -57,8 +60,6 @@ public:
|
||||
void addPreferredBaseEnvironment(const QString &displayName,
|
||||
const std::function<Utils::Environment()> &getter);
|
||||
|
||||
// The environment the user chose as base for his modifications.
|
||||
Utils::Environment baseEnvironment() const;
|
||||
QString currentDisplayName() const;
|
||||
|
||||
const QStringList displayNames() const;
|
||||
|
||||
@@ -75,7 +75,7 @@ EnvironmentAspectWidget::EnvironmentAspectWidget(EnvironmentAspect *aspect, QWid
|
||||
const EnvironmentWidget::Type widgetType = aspect->isLocal()
|
||||
? EnvironmentWidget::TypeLocal : EnvironmentWidget::TypeRemote;
|
||||
m_environmentWidget = new EnvironmentWidget(this, widgetType, baseEnvironmentWidget);
|
||||
m_environmentWidget->setBaseEnvironment(m_aspect->baseEnvironment());
|
||||
m_environmentWidget->setBaseEnvironment(m_aspect->modifiedBaseEnvironment());
|
||||
m_environmentWidget->setBaseEnvironmentText(m_aspect->currentDisplayName());
|
||||
m_environmentWidget->setUserChanges(m_aspect->userEnvironmentChanges());
|
||||
m_environmentWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||
@@ -106,7 +106,7 @@ void EnvironmentAspectWidget::baseEnvironmentSelected(int idx)
|
||||
{
|
||||
m_ignoreChange = true;
|
||||
m_aspect->setBaseEnvironmentBase(idx);
|
||||
m_environmentWidget->setBaseEnvironment(m_aspect->baseEnvironment());
|
||||
m_environmentWidget->setBaseEnvironment(m_aspect->modifiedBaseEnvironment());
|
||||
m_environmentWidget->setBaseEnvironmentText(m_aspect->currentDisplayName());
|
||||
m_ignoreChange = false;
|
||||
}
|
||||
@@ -122,7 +122,7 @@ void EnvironmentAspectWidget::changeBaseEnvironment()
|
||||
m_baseEnvironmentComboBox->setCurrentIndex(i);
|
||||
}
|
||||
m_environmentWidget->setBaseEnvironmentText(m_aspect->currentDisplayName());
|
||||
m_environmentWidget->setBaseEnvironment(m_aspect->baseEnvironment());
|
||||
m_environmentWidget->setBaseEnvironment(m_aspect->modifiedBaseEnvironment());
|
||||
}
|
||||
|
||||
void EnvironmentAspectWidget::userChangesEdited()
|
||||
@@ -143,7 +143,7 @@ void EnvironmentAspectWidget::environmentChanged()
|
||||
{
|
||||
if (m_ignoreChange)
|
||||
return;
|
||||
m_environmentWidget->setBaseEnvironment(m_aspect->baseEnvironment());
|
||||
m_environmentWidget->setBaseEnvironment(m_aspect->modifiedBaseEnvironment());
|
||||
}
|
||||
|
||||
} // namespace ProjectExplorer
|
||||
|
||||
@@ -499,9 +499,10 @@ public:
|
||||
class TreeView : public QTreeView
|
||||
{
|
||||
public:
|
||||
TreeView(QWidget *parent)
|
||||
TreeView(QWidget *parent, const QString &name)
|
||||
: QTreeView(parent)
|
||||
{
|
||||
setObjectName(name);
|
||||
header()->hide();
|
||||
setMouseTracking(true); // To enable hover.
|
||||
setIndentation(0);
|
||||
@@ -559,13 +560,13 @@ public:
|
||||
recentProjectsLabel->setFont(sizedFont(16, this));
|
||||
recentProjectsLabel->setText(ProjectWelcomePage::tr("Projects"));
|
||||
|
||||
auto sessionsList = new TreeView(this);
|
||||
auto sessionsList = new TreeView(this, "Sessions");
|
||||
sessionsList->setModel(projectWelcomePage->m_sessionModel);
|
||||
sessionsList->header()->setSectionHidden(1, true); // The "last modified" column.
|
||||
sessionsList->setItemDelegate(&m_sessionDelegate);
|
||||
sessionsList->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
|
||||
|
||||
auto projectsList = new TreeView(this);
|
||||
auto projectsList = new TreeView(this, "Recent Projects");
|
||||
projectsList->setUniformRowHeights(true);
|
||||
projectsList->setModel(projectWelcomePage->m_projectModel);
|
||||
projectsList->setItemDelegate(&m_projectDelegate);
|
||||
|
||||
@@ -408,9 +408,13 @@ void Target::addRunConfiguration(RunConfiguration *rc)
|
||||
|
||||
// Check that we don't have a configuration with the same displayName
|
||||
QString configurationDisplayName = rc->displayName();
|
||||
QStringList displayNames = Utils::transform(d->m_runConfigurations, &RunConfiguration::displayName);
|
||||
configurationDisplayName = Utils::makeUniquelyNumbered(configurationDisplayName, displayNames);
|
||||
if (!configurationDisplayName.isEmpty()) {
|
||||
QStringList displayNames = Utils::transform(d->m_runConfigurations,
|
||||
&RunConfiguration::displayName);
|
||||
configurationDisplayName = Utils::makeUniquelyNumbered(configurationDisplayName,
|
||||
displayNames);
|
||||
rc->setDisplayName(configurationDisplayName);
|
||||
}
|
||||
|
||||
d->m_runConfigurations.push_back(rc);
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ QtcPlugin {
|
||||
Depends { name: "TextEditor" }
|
||||
Depends { name: "ProjectExplorer" }
|
||||
Depends { name: "LanguageClient" }
|
||||
Depends { name: "LanguageServerProtocol" }
|
||||
|
||||
Group {
|
||||
name: "General"
|
||||
|
||||
@@ -62,9 +62,9 @@ public:
|
||||
, m_executable(new Utils::PathChooser())
|
||||
{
|
||||
auto mainLayout = new QGridLayout();
|
||||
mainLayout->addWidget(new QLabel(tr("Name:")), 0, 0);
|
||||
mainLayout->addWidget(new QLabel(PythonSettings::tr("Name:")), 0, 0);
|
||||
mainLayout->addWidget(m_name, 0, 1);
|
||||
mainLayout->addWidget(new QLabel(tr("Executable")), 1, 0);
|
||||
mainLayout->addWidget(new QLabel(PythonSettings::tr("Executable")), 1, 0);
|
||||
mainLayout->addWidget(m_executable, 1, 1);
|
||||
m_executable->setExpectedKind(Utils::PathChooser::ExistingCommand);
|
||||
setLayout(mainLayout);
|
||||
@@ -138,12 +138,12 @@ InterpreterOptionsWidget::InterpreterOptionsWidget(const QList<Interpreter> &int
|
||||
this,
|
||||
&InterpreterOptionsWidget::currentChanged);
|
||||
auto buttonLayout = new QVBoxLayout();
|
||||
auto addButton = new QPushButton(InterpreterOptionsWidget::tr("&Add"));
|
||||
auto addButton = new QPushButton(PythonSettings::tr("&Add"));
|
||||
connect(addButton, &QPushButton::pressed, this, &InterpreterOptionsWidget::addItem);
|
||||
m_deleteButton = new QPushButton(InterpreterOptionsWidget::tr("&Delete"));
|
||||
m_deleteButton = new QPushButton(PythonSettings::tr("&Delete"));
|
||||
m_deleteButton->setEnabled(false);
|
||||
connect(m_deleteButton, &QPushButton::pressed, this, &InterpreterOptionsWidget::deleteItem);
|
||||
m_makeDefaultButton = new QPushButton(InterpreterOptionsWidget::tr("&Make Default"));
|
||||
m_makeDefaultButton = new QPushButton(PythonSettings::tr("&Make Default"));
|
||||
m_makeDefaultButton->setEnabled(false);
|
||||
connect(m_makeDefaultButton, &QPushButton::pressed, this, &InterpreterOptionsWidget::makeDefault);
|
||||
mainLayout->addLayout(layout);
|
||||
@@ -230,9 +230,9 @@ private:
|
||||
InterpreterOptionsPage::InterpreterOptionsPage()
|
||||
{
|
||||
setId(Constants::C_PYTHONOPTIONS_PAGE_ID);
|
||||
setDisplayName(tr("Interpreters"));
|
||||
setDisplayName(PythonSettings::tr("Interpreters"));
|
||||
setCategory(Constants::C_PYTHON_SETTINGS_CATEGORY);
|
||||
setDisplayCategory(tr("Python"));
|
||||
setDisplayCategory(PythonSettings::tr("Python"));
|
||||
setCategoryIcon(Utils::Icon({{":/python/images/settingscategory_python.png",
|
||||
Utils::Theme::PanelTextColorDark}}, Utils::Icon::Tint));
|
||||
}
|
||||
@@ -385,7 +385,7 @@ static void addPythonsFromRegistry(QList<Interpreter> &pythons)
|
||||
const FilePath &executable = FilePath::fromUserInput(regVal.toString());
|
||||
if (executable.exists() && !alreadyRegistered(pythons, executable)) {
|
||||
pythons << Interpreter{QUuid::createUuid().toString(),
|
||||
name + InterpreterOptionsPage::tr(" (Windowed)"),
|
||||
name + PythonSettings::tr(" (Windowed)"),
|
||||
FilePath::fromUserInput(regVal.toString())};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -355,7 +355,7 @@ void QbsInstallStepConfigWidget::updateState()
|
||||
|
||||
m_commandLineTextEdit->setPlainText(command);
|
||||
|
||||
setSummaryText(tr("<b>Qbs:</b> %1").arg(command));
|
||||
setSummaryText(QbsInstallStep::tr("<b>Qbs:</b> %1").arg(command));
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
@@ -84,7 +84,7 @@ protected:
|
||||
|
||||
bool visit(AST::UiPublicMember *node) override
|
||||
{
|
||||
if (node->memberType->name == m_typeName){
|
||||
if (node->memberType && node->memberType->name == m_typeName){
|
||||
const ObjectValue * objectValue = m_context->lookupType(m_document.data(), QStringList(m_typeName));
|
||||
if (objectValue == m_typeValue)
|
||||
m_implemenations.append(node->typeToken);
|
||||
|
||||
@@ -109,7 +109,7 @@ void AlignDistribute::setModelNodeBackend(const QVariant &modelNodeBackend)
|
||||
// The purpose of this function is to suppress the following warning:
|
||||
// Warning: Property declaration modelNodeBackendProperty has no READ accessor
|
||||
// function or associated MEMBER variable. The property will be invalid.
|
||||
QVariant AlignDistribute::getModelNodeBackend() const
|
||||
QVariant AlignDistribute::modelNodeBackend() const
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ class AlignDistribute : public QObject
|
||||
Q_PROPERTY(bool selectionContainsRootItem READ selectionContainsRootItem NOTIFY
|
||||
modelNodeBackendChanged)
|
||||
|
||||
Q_PROPERTY(QVariant modelNodeBackendProperty READ getModelNodeBackend WRITE setModelNodeBackend
|
||||
Q_PROPERTY(QVariant modelNodeBackendProperty READ modelNodeBackend WRITE setModelNodeBackend
|
||||
NOTIFY modelNodeBackendChanged)
|
||||
|
||||
public:
|
||||
@@ -68,7 +68,6 @@ public:
|
||||
bool selectionContainsRootItem() const;
|
||||
|
||||
void setModelNodeBackend(const QVariant &modelNodeBackend);
|
||||
QVariant getModelNodeBackend() const;
|
||||
|
||||
static void registerDeclarativeType();
|
||||
|
||||
@@ -83,6 +82,9 @@ public:
|
||||
signals:
|
||||
void modelNodeBackendChanged();
|
||||
|
||||
private:
|
||||
QVariant modelNodeBackend() const;
|
||||
|
||||
private:
|
||||
using CompareFunction = std::function<bool(const ModelNode &, const ModelNode &)>;
|
||||
|
||||
|
||||
@@ -164,6 +164,7 @@ public:
|
||||
bool hasModelNodeForInternalId(qint32 internalId) 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 QString &error);
|
||||
|
||||
@@ -107,6 +107,8 @@ public:
|
||||
bool hasParentProperty() const;
|
||||
|
||||
const QList<ModelNode> directSubModelNodes() const;
|
||||
const QList<ModelNode> directSubModelNodesOfType(const TypeName &typeName) const;
|
||||
|
||||
const QList<ModelNode> allSubModelNodes() const;
|
||||
const QList<ModelNode> allSubModelNodesAndThisNode() const;
|
||||
bool hasAnySubModelNodes() const;
|
||||
|
||||
@@ -57,14 +57,7 @@ public:
|
||||
const QPointF &position,
|
||||
QmlItemNode parentQmlItemNode);
|
||||
|
||||
static QmlObjectNode createQmlObjectNode(AbstractView *view,
|
||||
const ItemLibraryEntry &itemLibraryEntry,
|
||||
const QPointF &position,
|
||||
QmlItemNode parentQmlItemNode);
|
||||
static QmlObjectNode createQmlObjectNode(AbstractView *view,
|
||||
const ItemLibraryEntry &itemLibraryEntry,
|
||||
const QPointF &position,
|
||||
NodeAbstractProperty parentproperty);
|
||||
|
||||
static QmlItemNode createQmlItemNodeFromImage(AbstractView *view,
|
||||
const QString &imageName,
|
||||
const QPointF &position,
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <QStringList>
|
||||
#include <QRectF>
|
||||
#include <QTransform>
|
||||
#include <QVector3D>
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
@@ -44,6 +45,26 @@ class QMLDESIGNERCORE_EXPORT QmlVisualNode : public QmlObjectNode
|
||||
{
|
||||
friend class QmlAnchors;
|
||||
public:
|
||||
|
||||
class Position
|
||||
{
|
||||
friend class QmlVisualNode;
|
||||
public:
|
||||
Position() {}
|
||||
Position(const QPointF &position) :
|
||||
m_2dPos(position)
|
||||
{}
|
||||
Position(const QVector3D &position) :
|
||||
m_3dPos(position)
|
||||
{}
|
||||
|
||||
QList<QPair<PropertyName, QVariant>> propertyPairList() const;
|
||||
|
||||
private:
|
||||
QPointF m_2dPos;
|
||||
QVector3D m_3dPos;
|
||||
};
|
||||
|
||||
QmlVisualNode() : QmlObjectNode() {}
|
||||
QmlVisualNode(const ModelNode &modelNode) : QmlObjectNode(modelNode) {}
|
||||
bool isValid() const override;
|
||||
@@ -64,7 +85,31 @@ public:
|
||||
void setVisibilityOverride(bool visible);
|
||||
bool visibilityOverride() const;
|
||||
|
||||
void initializePosition(const Position &position);
|
||||
|
||||
static bool isItemOr3DNode(const ModelNode &modelNode);
|
||||
|
||||
static QmlObjectNode createQmlObjectNode(AbstractView *view,
|
||||
const ItemLibraryEntry &itemLibraryEntry,
|
||||
const Position &position,
|
||||
QmlVisualNode parentQmlItemNode);
|
||||
|
||||
|
||||
|
||||
|
||||
static QmlObjectNode createQmlObjectNode(AbstractView *view,
|
||||
const ItemLibraryEntry &itemLibraryEntry,
|
||||
const Position &position,
|
||||
NodeAbstractProperty parentproperty);
|
||||
|
||||
static QmlVisualNode createQmlVisualNode(AbstractView *view,
|
||||
const ItemLibraryEntry &itemLibraryEntry,
|
||||
const QVector3D &position);
|
||||
|
||||
static NodeListProperty findSceneNodeProperty(AbstractView *view);
|
||||
|
||||
private:
|
||||
void setDoubleProperty(const PropertyName &name, double value);
|
||||
};
|
||||
|
||||
QMLDESIGNERCORE_EXPORT uint qHash(const QmlItemNode &node);
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
|
||||
#include <coreplugin/helpmanager.h>
|
||||
#include <utils/qtcassert.h>
|
||||
#include <utils/algorithm.h>
|
||||
|
||||
#include <QRegExp>
|
||||
|
||||
@@ -635,6 +636,13 @@ QList<ModelNode> AbstractView::allModelNodes() const
|
||||
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)
|
||||
{
|
||||
emitDocumentMessage({DocumentMessage(error)});
|
||||
|
||||
@@ -42,6 +42,8 @@
|
||||
#include "nodeproperty.h"
|
||||
#include <rewriterview.h>
|
||||
|
||||
#include <utils/algorithm.h>
|
||||
|
||||
#include <QHash>
|
||||
#include <QRegExp>
|
||||
#include <QSet>
|
||||
@@ -775,6 +777,13 @@ const QList<ModelNode> ModelNode::directSubModelNodes() const
|
||||
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
|
||||
|
||||
@@ -93,75 +93,6 @@ QmlItemNode QmlItemNode::createQmlItemNode(AbstractView *view,
|
||||
return QmlItemNode(createQmlObjectNode(view, itemLibraryEntry, position, parentQmlItemNode));
|
||||
}
|
||||
|
||||
QmlObjectNode QmlItemNode::createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, const QPointF &position, QmlItemNode parentQmlItemNode)
|
||||
{
|
||||
if (!parentQmlItemNode.isValid())
|
||||
parentQmlItemNode = QmlItemNode(view->rootModelNode());
|
||||
|
||||
Q_ASSERT(parentQmlItemNode.isValid());
|
||||
|
||||
NodeAbstractProperty parentProperty = parentQmlItemNode.defaultNodeAbstractProperty();
|
||||
|
||||
return QmlItemNode::createQmlObjectNode(view, itemLibraryEntry, position, parentProperty);
|
||||
}
|
||||
|
||||
QmlObjectNode QmlItemNode::createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, const QPointF &position, NodeAbstractProperty parentproperty)
|
||||
{
|
||||
QmlObjectNode newQmlObjectNode;
|
||||
|
||||
view->executeInTransaction("QmlItemNode::createQmlItemNode", [=, &newQmlObjectNode, &parentproperty](){
|
||||
NodeMetaInfo metaInfo = view->model()->metaInfo(itemLibraryEntry.typeName());
|
||||
|
||||
int minorVersion = metaInfo.minorVersion();
|
||||
int majorVersion = metaInfo.majorVersion();
|
||||
|
||||
using PropertyBindingEntry = QPair<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)
|
||||
{
|
||||
if (!parentQmlItemNode.isValid())
|
||||
|
||||
@@ -39,6 +39,8 @@
|
||||
#include "modelmerger.h"
|
||||
#include "rewritingexception.h"
|
||||
|
||||
#include <utils/qtcassert.h>
|
||||
|
||||
#include <QUrl>
|
||||
#include <QPlainTextEdit>
|
||||
#include <QFileInfo>
|
||||
@@ -74,7 +76,6 @@ bool QmlVisualNode::isRootNode() const
|
||||
return modelNode().isValid() && modelNode().isRootNode();
|
||||
}
|
||||
|
||||
|
||||
QList<QmlVisualNode> QmlVisualNode::children() const
|
||||
{
|
||||
QList<ModelNode> childrenList;
|
||||
@@ -166,6 +167,23 @@ bool QmlVisualNode::visibilityOverride() const
|
||||
return false;
|
||||
}
|
||||
|
||||
void QmlVisualNode::setDoubleProperty(const PropertyName &name, double value)
|
||||
{
|
||||
modelNode().variantProperty(name).setValue(value);
|
||||
}
|
||||
|
||||
void QmlVisualNode::initializePosition(const QmlVisualNode::Position &position)
|
||||
{
|
||||
if (!position.m_2dPos.isNull()) {
|
||||
setDoubleProperty("x", qRound(position.m_2dPos.x()));
|
||||
setDoubleProperty("y", qRound(position.m_2dPos.y()));
|
||||
} else if (!position.m_3dPos.isNull()) {
|
||||
setDoubleProperty("x", position.m_3dPos.x());
|
||||
setDoubleProperty("y", position.m_3dPos.y());
|
||||
setDoubleProperty("z", position.m_3dPos.z());
|
||||
}
|
||||
}
|
||||
|
||||
QmlModelStateGroup QmlVisualNode::states() const
|
||||
{
|
||||
if (isValid())
|
||||
@@ -174,6 +192,131 @@ QmlModelStateGroup QmlVisualNode::states() const
|
||||
return QmlModelStateGroup();
|
||||
}
|
||||
|
||||
QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view,
|
||||
const ItemLibraryEntry &itemLibraryEntry,
|
||||
const Position &position,
|
||||
QmlVisualNode parentQmlItemNode)
|
||||
{
|
||||
if (!parentQmlItemNode.isValid())
|
||||
parentQmlItemNode = QmlVisualNode(view->rootModelNode());
|
||||
|
||||
Q_ASSERT(parentQmlItemNode.isValid());
|
||||
|
||||
NodeAbstractProperty parentProperty = parentQmlItemNode.defaultNodeAbstractProperty();
|
||||
|
||||
return QmlItemNode::createQmlObjectNode(view, itemLibraryEntry, position, parentProperty);
|
||||
}
|
||||
|
||||
|
||||
static QmlObjectNode createQmlObjectNodeFromSource(AbstractView *view,
|
||||
const QString &source,
|
||||
const QmlVisualNode::Position &position)
|
||||
{
|
||||
QScopedPointer<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> modelNodeList;
|
||||
@@ -263,4 +406,20 @@ QmlModelState QmlModelStateGroup::state(const QString &name) const
|
||||
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
|
||||
|
||||
@@ -200,7 +200,7 @@ QmlPreviewPluginPrivate::QmlPreviewPluginPrivate(QmlPreviewPlugin *parent)
|
||||
|
||||
Core::Context projectTreeContext(Constants::C_PROJECT_TREE);
|
||||
menu = Core::ActionManager::actionContainer(Constants::M_FILECONTEXT);
|
||||
action = new QAction(tr("Preview File"), this);
|
||||
action = new QAction(QmlPreviewPlugin::tr("Preview File"), this);
|
||||
action->setEnabled(false);
|
||||
connect(q, &QmlPreviewPlugin::runningPreviewsChanged,
|
||||
action, [action](const QmlPreviewRunControlList &previews) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user