Merge remote-tracking branch 'origin/qds/dev'

Conflicts: src/plugins/qmldesigner/CMakeLists.txt

Change-Id: I250c8e5284ddb0f335c440999b8920762419c89b
This commit is contained in:
Tim Jenssen
2024-05-28 18:10:03 +02:00
436 changed files with 16128 additions and 15947 deletions

View File

@@ -26,10 +26,7 @@ if (NOT QT_CREATOR_API_DEFINED)
COMPONENTS Concurrent Core Gui Network PrintSupport Qml Quick Sql Widgets Xml
REQUIRED
)
endif()
if (NOT TARGET QmlPuppetCommunication)
include(../../libs/qmlpuppetcommunication/QmlPuppetCommunication.cmake)
set(IS_STAND_ALONE_PUPPET_BUILD ON)
endif()
add_qtc_executable(qml2puppet
@@ -44,31 +41,20 @@ add_qtc_executable(qml2puppet
SOURCES
qml2puppet/qml2puppetmain.cpp
qml2puppet/qmlbase.h
qml2puppet/appmetadata.cpp qml2puppet/appmetadata.h
qml2puppet/qmlpuppet.h qml2puppet/qmlpuppet.cpp qml2puppet/configcrashpad.h
qml2puppet/qmlpuppet.h qml2puppet/qmlpuppet.cpp
qml2puppet/configcrashpad.h
qmlpuppet.qrc
PROPERTIES
OUTPUT_NAME qml2puppet-${IDE_VERSION}
)
if (TARGET qml2puppet)
execute_process(
COMMAND git describe --tags --always --dirty=+
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
RESULT_VARIABLE GIT_SHA_RESULT
OUTPUT_VARIABLE GIT_SHA
ERROR_VARIABLE GIT_SHA_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE
)
#if we are not a git repository use the .tag file
if(NOT GIT_SHA)
file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/../../../.tag GIT_SHA LIMIT_COUNT 1)
endif()
set(IDE_REVISION_STR ${GIT_SHA})
configure_file(../../app/app_version.h.cmakein app/app_version.h ESCAPE_QUOTES)
if (IS_STAND_ALONE_PUPPET_BUILD)
include(../../libs/qmlpuppetcommunication/QmlPuppetCommunication.cmake)
configure_file(../../app/app_version.h.cmakein app/app_version.h ESCAPE_QUOTES)
else()
extend_qtc_executable(qml2puppet
DEPENDS app_version
)
endif()
extend_qtc_executable(qml2puppet
@@ -107,6 +93,7 @@ extend_qtc_executable(qml2puppet
linegeometry.cpp linegeometry.h
icongizmoimageprovider.cpp icongizmoimageprovider.h
boxgeometry.cpp boxgeometry.h
lookatgeometry.cpp lookatgeometry.h
)
find_package(Qt6 COMPONENTS Quick3DAssetImport QUIET)
@@ -159,6 +146,7 @@ extend_qtc_executable(qml2puppet
qmltransitionnodeinstance.cpp qmltransitionnodeinstance.h
qt3dpresentationnodeinstance.cpp qt3dpresentationnodeinstance.h
qt5bakelightsnodeinstanceserver.cpp qt5bakelightsnodeinstanceserver.h
qt5import3dnodeinstanceserver.cpp qt5import3dnodeinstanceserver.h
qt5informationnodeinstanceserver.cpp qt5informationnodeinstanceserver.h
qt5nodeinstanceclientproxy.cpp qt5nodeinstanceclientproxy.h
qt5nodeinstanceserver.cpp qt5nodeinstanceserver.h

View File

@@ -19,6 +19,8 @@
<file>mockfiles/images/spot@2x.png</file>
<file>mockfiles/images/preview_landscape.hdr</file>
<file>mockfiles/images/preview_studio.hdr</file>
<file>mockfiles/images/reflectionprobe.png</file>
<file>mockfiles/images/reflectionprobe@2x.png</file>
<file>mockfiles/qt6/AdjustableArrow.qml</file>
<file>mockfiles/qt6/Arrow.qml</file>
<file>mockfiles/qt6/AutoScaleHelper.qml</file>
@@ -35,6 +37,7 @@
<file>mockfiles/qt6/LightIconGizmo.qml</file>
<file>mockfiles/qt6/LightModel.qml</file>
<file>mockfiles/qt6/Line3D.qml</file>
<file>mockfiles/qt6/LookAtGizmo.qml</file>
<file>mockfiles/qt6/MaterialNodeView.qml</file>
<file>mockfiles/qt6/ModelNode2DImageView.qml</file>
<file>mockfiles/qt6/ModelNode3DImageView.qml</file>
@@ -50,6 +53,7 @@
<file>mockfiles/qt6/PlanarMoveHandle.qml</file>
<file>mockfiles/qt6/PlanarScaleHandle.qml</file>
<file>mockfiles/qt6/ReflectionProbeBox.qml</file>
<file>mockfiles/qt6/ReflectionProbeGizmo.qml</file>
<file>mockfiles/qt6/RotateGizmo.qml</file>
<file>mockfiles/qt6/RotateRing.qml</file>
<file>mockfiles/qt6/ScaleGizmo.qml</file>

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 887 B

View File

@@ -26,9 +26,10 @@ Item {
readonly property vector3d _defaultCameraPosition: Qt.vector3d(0, 600, 600)
readonly property vector3d _defaultCameraRotation: Qt.vector3d(-45, 0, 0)
readonly property real _defaultCameraLookAtDistance: _defaultCameraPosition.length()
readonly property real _keyPanAmount: _generalHelper.cameraSpeed
readonly property real _keyPanAmount: 1.0
property bool ignoreToolState: false
property bool flyMode: viewRoot.flyMode
property bool showCrosshairs: false
z: 10
anchors.fill: parent
@@ -112,7 +113,7 @@ Item {
if (resolvedResult) {
var newLookAtAndZoom = _generalHelper.approachNode(camera, _defaultCameraLookAtDistance,
resolvedResult, view3D);
resolvedResult, view3d);
_lookAtPoint = newLookAtAndZoom.toVector3d();
_zoomFactor = newLookAtAndZoom.w;
storeCameraState(0);
@@ -173,11 +174,15 @@ Item {
function rotateCamera(angles)
{
if (flyMode)
showCrosshairs = true;
cameraCtrl._lookAtPoint = _generalHelper.rotateCamera(camera, angles, _lookAtPoint);
}
function moveCamera(moveVec)
{
if (flyMode)
showCrosshairs = true;
cameraCtrl._lookAtPoint = _generalHelper.moveCamera(camera, _lookAtPoint, moveVec);
}
@@ -243,12 +248,19 @@ Item {
cameraCtrl._dragging = false;
cameraCtrl.storeCameraState(0);
}
_generalHelper.stopAllCameraMoves()
showCrosshairs = false;
_generalHelper.stopAllCameraMoves();
_generalHelper.setCameraSpeedModifier(1.0);
}
on_LookAtPointChanged: {
viewRoot.overlayViews[splitId].lookAtGizmo.position = _lookAtPoint;
}
Connections {
target: _generalHelper
enabled: viewRoot.activeSplit === cameraCtrl.splitId
function onRequestCameraMove(camera, moveVec) {
if (camera === cameraCtrl.camera) {
cameraCtrl.moveCamera(moveVec);
@@ -260,7 +272,7 @@ Item {
Image {
anchors.centerIn: parent
source: "qrc:///qtquickplugin/mockfiles/images/crosshair.png"
visible: cameraCtrl.flyMode && viewRoot.activeSplit === cameraCtrl.splitId
visible: cameraCtrl.showCrosshairs && viewRoot.activeSplit === cameraCtrl.splitId
opacity: 0.7
}
@@ -317,7 +329,7 @@ Item {
onWheel: (wheel) => {
if (cameraCtrl.flyMode && cameraCtrl.splitId !== viewRoot.activeSplit)
return;
viewRoot.activeSplit = cameraCtrl.splitId
viewRoot.activeSplit = cameraCtrl.splitId;
if (cameraCtrl.camera) {
// Empirically determined divisor for nice zoom
cameraCtrl.zoomRelative(wheel.angleDelta.y / -40);
@@ -326,7 +338,17 @@ Item {
}
}
function setCameraSpeed(event) {
if (event.modifiers === Qt.AltModifier)
_generalHelper.setCameraSpeedModifier(0.5);
else if (event.modifiers === Qt.ShiftModifier)
_generalHelper.setCameraSpeedModifier(2.0);
else
_generalHelper.setCameraSpeedModifier(1.0);
}
Keys.onPressed: (event) => {
setCameraSpeed(event)
event.accepted = true;
if (cameraCtrl.flyMode && event.key === Qt.Key_Space)
approachObject();
@@ -335,6 +357,7 @@ Item {
}
Keys.onReleased: (event) => {
setCameraSpeed(event)
event.accepted = true;
_generalHelper.stopCameraMove(cameraCtrl.getMoveVectorForKey(event.key));
}

View File

@@ -25,6 +25,7 @@ Item {
property bool showEditLight: false
property bool showGrid: true
property bool showLookAt: true
property bool showSelectionBox: true
property bool showIconGizmo: true
property bool showCameraFrustum: false
@@ -35,9 +36,10 @@ Item {
property color backgroundGradientColorStart: "#222222"
property color backgroundGradientColorEnd: "#999999"
property color gridColor: "#cccccc"
property bool syncEnvBackground: false
property bool syncEnvBackground: true
property bool splitView: false
property bool flyMode: false
property bool showCameraSpeed: false
enum SelectionMode { Item, Group }
enum TransformMode { Move, Rotate, Scale }
@@ -65,6 +67,7 @@ Item {
onShowEditLightChanged: _generalHelper.storeToolState(sceneId, "showEditLight", showEditLight)
onGlobalOrientationChanged: _generalHelper.storeToolState(sceneId, "globalOrientation", globalOrientation)
onShowGridChanged: _generalHelper.storeToolState(sceneId, "showGrid", showGrid);
onShowLookAtChanged: _generalHelper.storeToolState(sceneId, "showLookAt", showLookAt);
onSyncEnvBackgroundChanged: _generalHelper.storeToolState(sceneId, "syncEnvBackground", syncEnvBackground);
onShowSelectionBoxChanged: _generalHelper.storeToolState(sceneId, "showSelectionBox", showSelectionBox);
onShowIconGizmoChanged: _generalHelper.storeToolState(sceneId, "showIconGizmo", showIconGizmo);
@@ -165,7 +168,7 @@ Item {
break;
}
}
showEditLight = !hasSceneLight;
showEditLight = !hasSceneLight && !_generalHelper.sceneHasLightProbe(sceneId);
// Don't inherit camera angles from the previous scene
for (let i = 0; i < 4; ++i)
@@ -264,16 +267,22 @@ Item {
for (var i = 0; i < 4; ++i) {
if (syncEnvBackground) {
let bgMode = _generalHelper.sceneEnvironmentBgMode(sceneId);
if ((!_generalHelper.sceneEnvironmentLightProbe(sceneId) && bgMode === SceneEnvironment.SkyBox)
|| (!_generalHelper.sceneEnvironmentSkyBoxCubeMap(sceneId) && bgMode === SceneEnvironment.SkyBoxCubeMap)) {
editViews[i].sceneEnv.backgroundMode = SceneEnvironment.Color;
} else {
editViews[i].sceneEnv.backgroundMode = bgMode;
if (_generalHelper.hasSceneEnvironmentData(sceneId)) {
let bgMode = _generalHelper.sceneEnvironmentBgMode(sceneId);
if ((!_generalHelper.sceneEnvironmentLightProbe(sceneId) && bgMode === SceneEnvironment.SkyBox)
|| (!_generalHelper.sceneEnvironmentSkyBoxCubeMap(sceneId) && bgMode === SceneEnvironment.SkyBoxCubeMap)) {
editViews[i].sceneEnv.backgroundMode = SceneEnvironment.Color;
} else {
editViews[i].sceneEnv.backgroundMode = bgMode;
}
editViews[i].sceneEnv.lightProbe = _generalHelper.sceneEnvironmentLightProbe(sceneId);
editViews[i].sceneEnv.skyBoxCubeMap = _generalHelper.sceneEnvironmentSkyBoxCubeMap(sceneId);
editViews[i].sceneEnv.clearColor = _generalHelper.sceneEnvironmentColor(sceneId);
} else if (activeScene) {
_generalHelper.updateSceneEnvToLast(editViews[i].sceneEnv,
editViews[i].defaultLightProbe,
editViews[i].defaultCubeMap);
}
editViews[i].sceneEnv.lightProbe = _generalHelper.sceneEnvironmentLightProbe(sceneId);
editViews[i].sceneEnv.skyBoxCubeMap = _generalHelper.sceneEnvironmentSkyBoxCubeMap(sceneId);
editViews[i].sceneEnv.clearColor = _generalHelper.sceneEnvironmentColor(sceneId);
} else {
editViews[i].sceneEnv.backgroundMode = SceneEnvironment.Transparent;
editViews[i].sceneEnv.lightProbe = null;
@@ -297,11 +306,16 @@ Item {
else if (resetToDefault)
showGrid = true;
if ("showLookAt" in toolStates)
showLookAt = toolStates.showLookAt;
else if (resetToDefault)
showLookAt = true;
if ("syncEnvBackground" in toolStates) {
syncEnvBackground = toolStates.syncEnvBackground;
updateEnvBackground();
} else if (resetToDefault) {
syncEnvBackground = false;
syncEnvBackground = true;
updateEnvBackground();
}
@@ -353,10 +367,13 @@ Item {
cameraControls[i].restoreDefaultState();
}
if ("flyMode" in toolStates)
if ("flyMode" in toolStates) {
flyMode = toolStates.flyMode;
else if (resetToDefault)
viewRoot.showCameraSpeed = false;
} else if (resetToDefault) {
flyMode = false;
viewRoot.showCameraSpeed = false;
}
if ("splitView" in toolStates)
splitView = toolStates.splitView;
@@ -383,6 +400,7 @@ Item {
{
_generalHelper.storeToolState(sceneId, "showEditLight", showEditLight)
_generalHelper.storeToolState(sceneId, "showGrid", showGrid)
_generalHelper.storeToolState(sceneId, "showLookAt", showLookAt)
_generalHelper.storeToolState(sceneId, "syncEnvBackground", syncEnvBackground)
_generalHelper.storeToolState(sceneId, "showSelectionBox", showSelectionBox)
_generalHelper.storeToolState(sceneId, "showIconGizmo", showIconGizmo)
@@ -519,6 +537,12 @@ Item {
overlayViews[i].addParticleEmitterGizmo(scene, obj);
}
function addReflectionProbeGizmo(scene, obj)
{
for (var i = 0; i < 4; ++i)
overlayViews[i].addReflectionProbeGizmo(scene, obj);
}
function releaseLightGizmo(obj)
{
for (var i = 0; i < 4; ++i)
@@ -543,6 +567,12 @@ Item {
overlayViews[i].releaseParticleEmitterGizmo(obj);
}
function releaseReflectionProbeGizmo(obj)
{
for (var i = 0; i < 4; ++i)
overlayViews[i].releaseReflectionProbeGizmo(obj);
}
function updateLightGizmoScene(scene, obj)
{
for (var i = 0; i < 4; ++i)
@@ -567,6 +597,12 @@ Item {
overlayViews[i].updateParticleEmitterGizmoScene(scene, obj);
}
function updateReflectionProbeGizmoScene(scene, obj)
{
for (var i = 0; i < 4; ++i)
overlayViews[i].updateReflectionProbeGizmoScene(scene, obj);
}
function resolveSplitPoint(x, y)
{
if (!splitView || activeSplit === 0)
@@ -638,7 +674,6 @@ Item {
{
for (var i = 0; i < 4; ++i)
overlayViews[i].handleHiddenStateChange(node);
}
function onUpdateDragTooltip()
@@ -651,6 +686,18 @@ Item {
{
updateEnvBackground();
}
function onCameraSpeedChanged() {
_generalHelper.requestTimerEvent("hideSpeed", 1000);
viewRoot.showCameraSpeed = true
}
function onRequestedTimerEvent(timerId) {
if (timerId === "hideSpeed") {
viewRoot.showCameraSpeed = false;
_generalHelper.requestRender();
}
}
}
// Shared nodes of the overlay, set as importScene on all overlay views.
@@ -1058,6 +1105,38 @@ Item {
color: "white"
visible: viewRoot.fps > 0
}
Rectangle {
id: cameraSpeedLabel
width: 120
height: 65
anchors.centerIn: parent
opacity: 0.6
radius: 10
color: "white"
visible: flyMode && viewRoot.showCameraSpeed
enabled: false
Column {
anchors.fill: parent
anchors.margins: 8
spacing: 2
Text {
width: parent.width
horizontalAlignment: Text.AlignHCenter
text: "Camera Speed"
font.pixelSize: 16
}
Text {
width: parent.width
height: 20
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
font.pixelSize: 20
text: _generalHelper.cameraSpeed.toLocaleString(Qt.locale(), 'f', 1)
}
}
}
}
Keys.onPressed: (event) => {

View File

@@ -29,7 +29,7 @@ Item {
property alias iconSource: iconImage.source
signal clicked(Node node, bool multi)
signal clicked(Node node, int button, bool multi)
function hasPoint(x, y)
{
@@ -83,7 +83,7 @@ Item {
}
onClicked: (mouse)=> {
iconGizmo.clicked(iconGizmo.targetNode,
iconGizmo.clicked(iconGizmo.targetNode, mouse.button,
mouse.modifiers & Qt.ControlModifier);
}
hoverEnabled: iconGizmo.highlightOnHover && !iconGizmo.selected

View File

@@ -0,0 +1,27 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
import QtQuick
import QtQuick3D
import LookAtGeometry
Node {
id: root
property alias crossScale: lookAtGeometry.crossScale
property alias color: lookAtMat.baseColor
Model {
readonly property bool _edit3dLocked: true // Make this non-pickable
geometry: LookAtGeometry {
id: lookAtGeometry
}
materials: [
PrincipledMaterial {
id: lookAtMat
lighting: DefaultMaterial.NoLighting
cullMode: Material.NoCulling
}
]
}
}

View File

@@ -12,6 +12,7 @@ View3D {
property alias rotateGizmo: rotateGizmo
property alias scaleGizmo: scaleGizmo
property alias lightGizmo: lightGizmo
property alias lookAtGizmo: lookAtGizmo
property var viewRoot: null
property View3D editView: null
@@ -21,6 +22,7 @@ View3D {
property var cameraGizmos: []
property var particleSystemIconGizmos: []
property var particleEmitterGizmos: []
property var reflectionProbeGizmos: []
signal commitObjectProperty(var objects, var propNames)
signal changeObjectProperty(var objects, var propNames)
@@ -288,66 +290,141 @@ View3D {
}
}
function addReflectionProbeGizmo(scene, obj)
{
// Insert into first available gizmo if we don't already have gizmo for this object
var slotFound = -1;
for (var i = 0; i < reflectionProbeGizmos.length; ++i) {
if (!reflectionProbeGizmos[i].targetNode) {
slotFound = i;
} else if (reflectionProbeGizmos[i].targetNode === obj) {
reflectionProbeGizmos[i].scene = scene;
return;
}
}
if (slotFound !== -1) {
reflectionProbeGizmos[slotFound].scene = scene;
reflectionProbeGizmos[slotFound].targetNode = obj;
reflectionProbeGizmos[slotFound].locked = _generalHelper.isLocked(obj);
reflectionProbeGizmos[slotFound].hidden = _generalHelper.isHidden(obj);
return;
}
// No free gizmos available, create a new one
var gizmoComponent = Qt.createComponent("ReflectionProbeGizmo.qml");
if (gizmoComponent.status === Component.Ready) {
var gizmo = gizmoComponent.createObject(overlayView,
{"view3D": overlayView,
"targetNode": obj,
"selectedNodes": viewRoot.selectedNodes,
"scene": scene,
"activeScene": viewRoot.activeScene,
"locked": _generalHelper.isLocked(obj),
"hidden": _generalHelper.isHidden(obj),
"globalShow": viewRoot.showIconGizmo});
reflectionProbeGizmos[reflectionProbeGizmos.length] = gizmo;
gizmo.clicked.connect(viewRoot.handleObjectClicked);
gizmo.selectedNodes = Qt.binding(function() {return viewRoot.selectedNodes;});
gizmo.activeScene = Qt.binding(function() {return viewRoot.activeScene;});
gizmo.globalShow = Qt.binding(function() {return viewRoot.showIconGizmo;});
}
}
function releaseReflectionProbeGizmo(obj)
{
for (var i = 0; i < reflectionProbeGizmos.length; ++i) {
if (reflectionProbeGizmos[i].targetNode === obj) {
reflectionProbeGizmos[i].scene = null;
reflectionProbeGizmos[i].targetNode = null;
return;
}
}
}
function updateReflectionProbeGizmoScene(scene, obj)
{
for (var i = 0; i < reflectionProbeGizmos.length; ++i) {
if (reflectionProbeGizmos[i].targetNode === obj) {
reflectionProbeGizmos[i].scene = scene;
return;
}
}
}
function gizmoAt(x, y)
{
for (var i = 0; i < lightIconGizmos.length; ++i) {
let i = 0;
for (; i < lightIconGizmos.length; ++i) {
if (lightIconGizmos[i].visible && lightIconGizmos[i].hasPoint(x, y))
return lightIconGizmos[i].targetNode;
}
for (var i = 0; i < cameraGizmos.length; ++i) {
for (i = 0; i < cameraGizmos.length; ++i) {
if (cameraGizmos[i].visible && cameraGizmos[i].hasPoint(x, y))
return cameraGizmos[i].targetNode;
}
for (var i = 0; i < particleSystemIconGizmos.length; ++i) {
for (i = 0; i < particleSystemIconGizmos.length; ++i) {
if (particleSystemIconGizmos[i].visible && particleSystemIconGizmos[i].hasPoint(x, y))
return particleSystemIconGizmos[i].targetNode;
}
for (i = 0; i < reflectionProbeGizmos.length; ++i) {
if (reflectionProbeGizmos[i].visible && reflectionProbeGizmos[i].hasPoint(x, y))
return reflectionProbeGizmos[i].targetNode;
}
return null;
}
function handleLockedStateChange(node)
{
for (var i = 0; i < lightIconGizmos.length; ++i) {
let i = 0;
for (; i < lightIconGizmos.length; ++i) {
if (lightIconGizmos[i].targetNode === node) {
lightIconGizmos[i].locked = _generalHelper.isLocked(node);
return;
}
}
for (var i = 0; i < cameraGizmos.length; ++i) {
for (i = 0; i < cameraGizmos.length; ++i) {
if (cameraGizmos[i].targetNode === node) {
cameraGizmos[i].locked = _generalHelper.isLocked(node);
return;
}
}
for (var i = 0; i < particleSystemIconGizmos.length; ++i) {
for (i = 0; i < particleSystemIconGizmos.length; ++i) {
if (particleSystemIconGizmos[i].targetNode === node) {
particleSystemIconGizmos[i].locked = _generalHelper.isLocked(node);
return;
}
}
for (i = 0; i < reflectionProbeGizmos.length; ++i) {
if (reflectionProbeGizmos[i].targetNode === node) {
reflectionProbeGizmos[i].locked = _generalHelper.isLocked(node);
return;
}
}
}
function handleHiddenStateChange(node)
{
for (var i = 0; i < lightIconGizmos.length; ++i) {
let i = 0;
for (; i < lightIconGizmos.length; ++i) {
if (lightIconGizmos[i].targetNode === node) {
lightIconGizmos[i].hidden = _generalHelper.isHidden(node);
return;
}
}
for (var i = 0; i < cameraGizmos.length; ++i) {
for (i = 0; i < cameraGizmos.length; ++i) {
if (cameraGizmos[i].targetNode === node) {
cameraGizmos[i].hidden = _generalHelper.isHidden(node);
return;
}
}
for (var i = 0; i < particleSystemIconGizmos.length; ++i) {
for (i = 0; i < particleSystemIconGizmos.length; ++i) {
if (particleSystemIconGizmos[i].targetNode === node) {
particleSystemIconGizmos[i].hidden = _generalHelper.isHidden(node);
return;
}
}
for (var i = 0; i < particleEmitterGizmos.length; ++i) {
for (i = 0; i < particleEmitterGizmos.length; ++i) {
if (particleEmitterGizmos[i].targetNode === node) {
particleEmitterGizmos[i].hidden = _generalHelper.isHidden(node);
return;
@@ -356,6 +433,12 @@ View3D {
return;
}
}
for (i = 0; i < reflectionProbeGizmos.length; ++i) {
if (reflectionProbeGizmos[i].targetNode === node) {
reflectionProbeGizmos[i].hidden = _generalHelper.isHidden(node);
return;
}
}
}
SceneEnvironment {
@@ -402,6 +485,12 @@ View3D {
position: pivotLine.startPos
}
AutoScaleHelper {
id: lookAtAutoScale
view3D: overlayView
position: lookAtGizmo.scenePosition
}
MoveGizmo {
id: moveGizmo
scale: autoScale.getScale(Qt.vector3d(5, 5, 5))
@@ -537,5 +626,14 @@ View3D {
]
}
}
LookAtGizmo {
id: lookAtGizmo
color: "#ddd600"
scale: lookAtAutoScale.getScale(Qt.vector3d(10, 10, 10))
visible: overlayView.viewRoot.showLookAt
&& overlayView.isActive
&& !overlayView.viewRoot.cameraControls[viewRoot.activeSplit].showCrosshairs
}
}
}

View File

@@ -0,0 +1,9 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
import QtQuick
import QtQuick3D
IconGizmo {
iconSource: "qrc:///qtquickplugin/mockfiles/images/reflectionprobe.png"
}

View File

@@ -15,6 +15,8 @@ View3D {
property alias perspectiveCamera: scenePerspectiveCamera
property alias orthoCamera: sceneOrthoCamera
property alias sceneEnv: sceneEnv
property alias defaultLightProbe: defaultLightProbe
property alias defaultCubeMap: defaultCubeMap
property vector3d cameraLookAt
property var selectionBoxes: []
property Node selectedNode
@@ -61,6 +63,14 @@ View3D {
id: sceneEnv
antialiasingMode: SceneEnvironment.MSAA
antialiasingQuality: SceneEnvironment.High
Texture {
id: defaultLightProbe
}
CubeMapTexture {
id: defaultCubeMap
}
}
Node {

View File

@@ -1,51 +0,0 @@
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
#include "appmetadata.h"
#include <app/app_version.h>
namespace QDSMeta::AppInfo {
void printAppInfo()
{
qInfo() << Qt::endl
<< "<< QDS Meta Info >>" << Qt::endl
<< "App Info" << Qt::endl
<< " - Name :" << Core::Constants::IDE_ID << Qt::endl
<< " - Version :" << Core::Constants::IDE_VERSION_DISPLAY << Qt::endl
<< " - Author :" << Core::Constants::IDE_AUTHOR << Qt::endl
<< " - Year :" << Core::Constants::IDE_YEAR << Qt::endl
<< " - App :" << QCoreApplication::applicationName() << Qt::endl
<< "Build Info " << Qt::endl
<< " - Date :" << __DATE__ << Qt::endl
<< " - Commit :" << QStringLiteral(QDS_STRINGIFY(IDE_REVISION_STR)) << Qt::endl
<< " - Qt Version :" << QT_VERSION_STR << Qt::endl
<< "Compiler Info " << Qt::endl
#if defined(__GNUC__)
<< " - GCC :" << __GNUC__ << Qt::endl
<< " - GCC Minor :" << __GNUC_MINOR__ << Qt::endl
<< " - GCC Patch :" << __GNUC_PATCHLEVEL__ << Qt::endl
#endif
#if defined(_MSC_VER)
<< " - MSC Short :" << _MSC_VER << Qt::endl
<< " - MSC Full :" << _MSC_FULL_VER << Qt::endl
#endif
#if defined(__clang__)
<< " - clang maj :" << __clang_major__ << Qt::endl
<< " - clang min :" << __clang_minor__ << Qt::endl
<< " - clang patch :" << __clang_patchlevel__ << Qt::endl
#endif
<< "<< End Of QDS Meta Info >>" << Qt::endl;
exit(0);
}
void registerAppInfo(const QString &appName)
{
QCoreApplication::setOrganizationName(Core::Constants::IDE_AUTHOR);
QCoreApplication::setOrganizationDomain("qt-project.org");
QCoreApplication::setApplicationName(appName);
QCoreApplication::setApplicationVersion(Core::Constants::IDE_VERSION_LONG);
}
} // namespace QDSMeta::AppInfo

View File

@@ -1,55 +0,0 @@
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include <QCommandLineParser>
#include <QLoggingCategory>
// Common functions can be used in all QDS apps
namespace QDSMeta {
namespace Logging {
inline Q_LOGGING_CATEGORY(deprecated, "qt.tools.qds.deprecated");
inline Q_LOGGING_CATEGORY(verbose1, "qt.tools.qds.verbose1");
inline Q_LOGGING_CATEGORY(verbose2, "qt.tools.qds.verbose2");
inline void registerMessageHandler()
{
qInstallMessageHandler(
[](QtMsgType type, const QMessageLogContext &context, const QString &msg) {
auto tPrinter = [&](const QString &msgPrefix) {
fprintf(stderr,
"%s: %s (%s:%u, %s)\n",
msgPrefix.toLocal8Bit().constData(),
msg.toLocal8Bit().constData(),
context.file,
context.line,
context.function);
};
if (type == QtDebugMsg)
tPrinter("Debug");
else if (type == QtInfoMsg)
tPrinter("Info");
else if (type == QtWarningMsg)
tPrinter("Warning");
else if (type == QtCriticalMsg)
tPrinter("Critical");
else if (type == QtFatalMsg) {
tPrinter("Fatal");
abort();
}
});
}
} // namespace Logging
namespace AppInfo {
#define STRINGIFY_INTERNAL(x) #x
#define QDS_STRINGIFY(x) STRINGIFY_INTERNAL(x)
void printAppInfo();
void registerAppInfo(const QString &appName);
} // namespace AppInfo
} // namespace QDSMeta

View File

@@ -5,6 +5,7 @@
#include <QtGlobal>
#if defined(ENABLE_CRASHPAD) && defined(Q_OS_WIN)
#include <QDir>
#define NOMINMAX
#include "client/crash_report_database.h"
#include "client/crashpad_client.h"

View File

@@ -6,6 +6,8 @@
#include "selectionboxgeometry.h"
#include <enumeration.h>
#include <QGuiApplication>
#include <QtQuick3D/qquick3dobject.h>
#include <QtQuick3D/private/qquick3dorthographiccamera_p.h>
@@ -42,9 +44,17 @@
namespace QmlDesigner {
namespace Internal {
const QString _globalStateId = QStringLiteral("@GTS"); // global tool state
const QString _globalStateId = QStringLiteral("@GTS"); // global tool state (within document)
const QString _projectStateId = QStringLiteral("@PTS"); // project wide tool state
const QString _lastSceneIdKey = QStringLiteral("lastSceneId");
const QString _rootSizeKey = QStringLiteral("rootSize");
const QString _lastSceneEnvKey = QStringLiteral("lastSceneEnv");
const QString _lightProbeProp = QStringLiteral("lightProbe");
const QString _sourceProp = QStringLiteral("source");
const QString _cubeProp = QStringLiteral("skyBoxCubeMap");
const QString _bgProp = QStringLiteral("backgroundMode");
const QString _colorProp = QStringLiteral("clearColor");
static const float floatMin = std::numeric_limits<float>::lowest();
static const float floatMax = std::numeric_limits<float>::max();
@@ -163,16 +173,17 @@ QVector3D GeneralHelper::moveCamera(QQuick3DCamera *camera, const QVector3D &sta
if (moveVector.length() < 0.001f)
return startLookAt;
QVector3D speedVector = moveVector * m_cameraSpeed * m_cameraSpeedModifier;
QMatrix4x4 m = camera->sceneTransform(); // Works because edit camera is at scene root
const float *dataPtr(m.data());
const QVector3D xAxis = QVector3D(dataPtr[0], dataPtr[1], dataPtr[2]).normalized();
const QVector3D yAxis = QVector3D(dataPtr[4], dataPtr[5], dataPtr[6]).normalized();
const QVector3D zAxis = QVector3D(dataPtr[8], dataPtr[9], dataPtr[10]).normalized();
const QVector3D xDelta = xAxis * moveVector.x();
const QVector3D yDelta = yAxis * moveVector.y();
const QVector3D zDelta = zAxis * moveVector.z();
// Delta multiplier for nice default speed in default scene
const QVector3D delta = (yDelta - xDelta - zDelta) * .5f;
const QVector3D xDelta = xAxis * speedVector.x();
const QVector3D yDelta = yAxis * speedVector.y();
const QVector3D zDelta = zAxis * speedVector.z();
const QVector3D delta = (yDelta - xDelta - zDelta);
camera->setPosition(camera->position() + delta);
@@ -451,17 +462,19 @@ QVector4D GeneralHelper::approachNode(
// a selection box for bound calculations to work. This is used to focus the view for
// various preview image generations, where doing things asynchronously is not good
// and recalculating bounds for every frame is not a problem.
void GeneralHelper::calculateNodeBoundsAndFocusCamera(
QQuick3DCamera *camera, QQuick3DNode *node, QQuick3DViewport *viewPort,
float defaultLookAtDistance, bool closeUp)
void GeneralHelper::calculateBoundsAndFocusCamera(QQuick3DCamera *camera, QQuick3DNode *node,
QQuick3DViewport *viewPort,
float defaultLookAtDistance,
bool closeUp, QVector3D &lookAt,
QVector3D &extents)
{
QVector3D minBounds;
QVector3D maxBounds;
getBounds(viewPort, node, minBounds, maxBounds);
QVector3D extents = maxBounds - minBounds;
QVector3D lookAt = minBounds + (extents / 2.f);
extents = maxBounds - minBounds;
lookAt = minBounds + (extents / 2.f);
float maxExtent = qSqrt(qreal(extents.x()) * qreal(extents.x())
+ qreal(extents.y()) * qreal(extents.y())
+ qreal(extents.z()) * qreal(extents.z()));
@@ -494,10 +507,20 @@ void GeneralHelper::calculateNodeBoundsAndFocusCamera(
perspectiveCamera->setClipNear(minDist * 0.99);
perspectiveCamera->setClipFar(maxDist * 1.01);
}
}
}
void GeneralHelper::calculateNodeBoundsAndFocusCamera(QQuick3DCamera *camera, QQuick3DNode *node,
QQuick3DViewport *viewPort,
float defaultLookAtDistance,
bool closeUp)
{
QVector3D extents;
QVector3D lookAt;
calculateBoundsAndFocusCamera(camera, node, viewPort, defaultLookAtDistance, closeUp,
lookAt, extents);
}
// Aligns any cameras found in nodes list to a camera.
// Only position and rotation are copied, rest of the camera properties stay the same.
void GeneralHelper::alignCameras(QQuick3DCamera *camera, const QVariant &nodes)
@@ -738,6 +761,11 @@ void GeneralHelper::setSceneEnvironmentData(const QString &sceneId,
}
}
bool GeneralHelper::hasSceneEnvironmentData(const QString &sceneId) const
{
return m_sceneEnvironmentData.contains(sceneId);
}
QQuick3DSceneEnvironment::QQuick3DEnvironmentBackgroundTypes GeneralHelper::sceneEnvironmentBgMode(
const QString &sceneId) const
{
@@ -759,6 +787,69 @@ QQuick3DCubeMapTexture *GeneralHelper::sceneEnvironmentSkyBoxCubeMap(const QStri
return m_sceneEnvironmentData[sceneId].skyBoxCubeMap.data();
}
void GeneralHelper::updateSceneEnvToLast(QQuick3DSceneEnvironment *env, QQuick3DTexture *lightProbe,
QQuick3DCubeMapTexture *cubeMap)
{
if (!env)
return;
if (m_lastSceneEnvData.contains(_bgProp)) {
Enumeration enumeration = m_lastSceneEnvData[_bgProp].value<Enumeration>();
QMetaEnum me = QMetaEnum::fromType<QQuick3DSceneEnvironment::QQuick3DEnvironmentBackgroundTypes>();
int intValue = me.keyToValue(enumeration.toName());
env->setBackgroundMode(QQuick3DSceneEnvironment::QQuick3DEnvironmentBackgroundTypes(intValue));
} else {
env->setBackgroundMode(QQuick3DSceneEnvironment::Transparent);
}
if (m_lastSceneEnvData.contains(_colorProp))
env->setClearColor(m_lastSceneEnvData[_colorProp].value<QColor>());
else
env->setClearColor(Qt::transparent);
if (lightProbe) {
if (m_lastSceneEnvData.contains(_lightProbeProp)) {
QVariantMap props = m_lastSceneEnvData[_lightProbeProp].toMap();
if (props.contains(_sourceProp))
lightProbe->setSource(props[_sourceProp].toUrl());
else
lightProbe->setSource({});
env->setLightProbe(lightProbe);
} else {
env->setLightProbe(nullptr);
}
}
if (cubeMap) {
if (m_lastSceneEnvData.contains(_cubeProp)) {
QVariantMap props = m_lastSceneEnvData[_cubeProp].toMap();
if (props.contains(_sourceProp))
cubeMap->setSource(props[_sourceProp].toUrl());
else
cubeMap->setSource({});
env->setSkyBoxCubeMap(cubeMap);
} else {
env->setSkyBoxCubeMap(nullptr);
}
}
}
bool GeneralHelper::sceneHasLightProbe(const QString &sceneId)
{
// From editor perspective, a scene is considered to have a light probe if scene itself
// has a light probe or scene has no env data and last scene had a light probe
if (m_sceneEnvironmentData.contains(sceneId)) {
return bool(m_sceneEnvironmentData[sceneId].lightProbe);
} else {
if (m_lastSceneEnvData.contains(_lightProbeProp)) {
QVariantMap props = m_lastSceneEnvData[_sourceProp].toMap();
if (props.contains(_sourceProp))
return !props[_sourceProp].toUrl().isEmpty();
}
}
return false;
}
void GeneralHelper::clearSceneEnvironmentData()
{
for (const SceneEnvData &data : std::as_const(m_sceneEnvironmentData)) {
@@ -772,6 +863,12 @@ void GeneralHelper::clearSceneEnvironmentData()
emit sceneEnvDataChanged();
}
void GeneralHelper::setLastSceneEnvironmentData(const QVariantMap &data)
{
m_lastSceneEnvData = data;
storeToolState(_projectStateId, _lastSceneEnvKey, m_lastSceneEnvData);
}
void GeneralHelper::initToolStates(const QString &sceneId, const QVariantMap &toolStates)
{
m_toolStates[sceneId] = toolStates;
@@ -796,11 +893,21 @@ QString GeneralHelper::globalStateId() const
return _globalStateId;
}
QString GeneralHelper::projectStateId() const
{
return _projectStateId;
}
QString GeneralHelper::lastSceneIdKey() const
{
return _lastSceneIdKey;
}
QString GeneralHelper::lastSceneEnvKey() const
{
return _lastSceneEnvKey;
}
QString GeneralHelper::rootSizeKey() const
{
return _rootSizeKey;
@@ -1187,6 +1294,11 @@ void GeneralHelper::setCameraSpeed(double speed)
}
}
void GeneralHelper::setCameraSpeedModifier(double modifier)
{
m_cameraSpeedModifier = modifier;
}
QString GeneralHelper::formatVectorDragTooltip(const QVector3D &vec, const QString &suffix) const
{
return QObject::tr("x:%L1 y:%L2 z:%L3%L4")
@@ -1414,6 +1526,26 @@ bool GeneralHelper::compareQuaternions(const QQuaternion &q1, const QQuaternion
&& qFuzzyCompare(q1.z(), q2.z()) && qFuzzyCompare(q1.scalar(), q2.scalar());
}
void GeneralHelper::requestTimerEvent(const QString &timerId, qint64 delay)
{
if (m_eventTimers.contains(timerId)) {
m_eventTimers[timerId]->start(delay);
} else {
auto timer = new QTimer;
timer->setInterval(delay);
timer->setSingleShot(true);
connect(timer, &QTimer::timeout, this, [this, timerId]() {
if (m_eventTimers.contains(timerId)) {
QTimer *timer = m_eventTimers.take(timerId);
timer->deleteLater();
}
emit requestedTimerEvent(timerId);
});
m_eventTimers[timerId] = timer;
timer->start(delay);
}
}
}
}

View File

@@ -72,6 +72,9 @@ public:
bool closeUp = false);
Q_INVOKABLE QVector4D approachNode(QQuick3DCamera *camera, float defaultLookAtDistance,
QObject *node, QQuick3DViewport *viewPort);
void calculateBoundsAndFocusCamera(QQuick3DCamera *camera, QQuick3DNode *node,
QQuick3DViewport *viewPort, float defaultLookAtDistance,
bool closeUp, QVector3D &lookAt, QVector3D &extents);
Q_INVOKABLE void calculateNodeBoundsAndFocusCamera(QQuick3DCamera *camera, QQuick3DNode *node,
QQuick3DViewport *viewPort,
float defaultLookAtDistance, bool closeUp);
@@ -96,7 +99,9 @@ public:
Q_INVOKABLE void enableItemUpdate(QQuickItem *item, bool enable);
Q_INVOKABLE QVariantMap getToolStates(const QString &sceneId);
QString globalStateId() const;
QString projectStateId() const;
QString lastSceneIdKey() const;
QString lastSceneEnvKey() const;
QString rootSizeKey() const;
Q_INVOKABLE void setMultiSelectionTargets(QQuick3DNode *multiSelectRootNode,
@@ -109,12 +114,18 @@ public:
Q_INVOKABLE void rotateMultiSelection(bool commit);
void setSceneEnvironmentData(const QString &sceneId, QQuick3DSceneEnvironment *env);
Q_INVOKABLE bool hasSceneEnvironmentData(const QString &sceneId) const;
Q_INVOKABLE QQuick3DSceneEnvironment::QQuick3DEnvironmentBackgroundTypes sceneEnvironmentBgMode(
const QString &sceneId) const;
Q_INVOKABLE QColor sceneEnvironmentColor(const QString &sceneId) const;
Q_INVOKABLE QQuick3DTexture *sceneEnvironmentLightProbe(const QString &sceneId) const;
Q_INVOKABLE QQuick3DCubeMapTexture *sceneEnvironmentSkyBoxCubeMap(const QString &sceneId) const;
Q_INVOKABLE void updateSceneEnvToLast(QQuick3DSceneEnvironment *env, QQuick3DTexture *lightProbe,
QQuick3DCubeMapTexture *cubeMap);
Q_INVOKABLE bool sceneHasLightProbe(const QString &sceneId);
void clearSceneEnvironmentData();
void setLastSceneEnvironmentData(const QVariantMap &data);
bool isMacOS() const;
@@ -139,6 +150,7 @@ public:
void setSnapRotationInterval(double interval) { m_snapRotationInterval = interval; }
void setSnapScaleInterval(double interval) { m_snapScaleInterval = interval / 100.; }
void setCameraSpeed(double speed);
Q_INVOKABLE void setCameraSpeedModifier(double modifier);
Q_INVOKABLE QString snapPositionDragTooltip(const QVector3D &pos) const;
Q_INVOKABLE QString snapRotationDragTooltip(double angle) const;
@@ -154,6 +166,8 @@ public:
Q_INVOKABLE bool compareVectors(const QVector3D &v1, const QVector3D &v2) const;
Q_INVOKABLE bool compareQuaternions(const QQuaternion &q1, const QQuaternion &q2) const;
Q_INVOKABLE void requestTimerEvent(const QString &timerId, qint64 delay);
signals:
void overlayUpdateNeeded();
void toolStateChanged(const QString &sceneId, const QString &tool, const QVariant &toolState);
@@ -167,6 +181,7 @@ signals:
void requestCameraMove(QQuick3DCamera *camera, const QVector3D &moveVector);
void requestRender();
void cameraSpeedChanged();
void requestedTimerEvent(const QString &timerId);
private:
void handlePendingToolStateUpdate();
@@ -198,6 +213,7 @@ private:
QPointer<QQuick3DCubeMapTexture> skyBoxCubeMap;
};
QHash<QString, SceneEnvData> m_sceneEnvironmentData;
QVariantMap m_lastSceneEnvData;
struct MultiSelData {
QVector3D startScenePos;
@@ -221,8 +237,10 @@ private:
double m_snapRotationInterval = 5.;
double m_snapScaleInterval = .1;
double m_cameraSpeed = 10.;
double m_cameraSpeedModifier = 1.;
QVariant m_bgColor;
QHash<QString, QTimer *> m_eventTimers;
};
}

View File

@@ -0,0 +1,62 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#ifdef QUICK3D_MODULE
#include "lookatgeometry.h"
namespace QmlDesigner::Internal {
LookAtGeometry::LookAtGeometry()
: GeometryBase()
, m_crossScale(1.f, 1.f, 1.f)
{
}
LookAtGeometry::~LookAtGeometry()
{
}
QVector3D LookAtGeometry::crossScale() const
{
return m_crossScale;
}
void LookAtGeometry::setCrossScale(const QVector3D &scale)
{
if (scale != m_crossScale) {
m_crossScale = scale;
emit crossScaleChanged();
updateGeometry();
}
}
void LookAtGeometry::doUpdateGeometry()
{
GeometryBase::doUpdateGeometry();
QByteArray vertexData;
vertexData.resize(6 * 3 * 4); // 6 vertices of 3 floats each 4 bytes
float *dataPtr = reinterpret_cast<float *>(vertexData.data());
auto addVertex = [&dataPtr](float x, float y, float z) {
dataPtr[0] = x;
dataPtr[1] = y;
dataPtr[2] = z;
dataPtr += 3;
};
addVertex(m_crossScale.x(), 0.f, 0.f);
addVertex(-m_crossScale.x(), 0.f, 0.f);
addVertex(0.f, m_crossScale.y(), 0.f);
addVertex(0.f, -m_crossScale.y(), 0.f);
addVertex(0.f, 0.f, m_crossScale.z());
addVertex(0.f, 0.f, -m_crossScale.z());
setVertexData(vertexData);
setBounds(-m_crossScale, m_crossScale);
}
} // namespace QmlDesigner::Internal
#endif // QUICK3D_MODULE

View File

@@ -0,0 +1,42 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#ifdef QUICK3D_MODULE
#include "geometrybase.h"
#include <QtGui/QVector3D>
namespace QmlDesigner::Internal {
class LookAtGeometry : public GeometryBase
{
Q_OBJECT
Q_PROPERTY(QVector3D crossScale READ crossScale WRITE setCrossScale NOTIFY crossScaleChanged)
public:
LookAtGeometry();
~LookAtGeometry() override;
QVector3D crossScale() const;
public slots:
void setCrossScale(const QVector3D &pos);
signals:
void crossScaleChanged();
protected:
void doUpdateGeometry() override;
private:
QVector3D m_crossScale;
};
} // namespace QmlDesigner::Internal
QML_DECLARE_TYPE(QmlDesigner::Internal::LookAtGeometry)
#endif // QUICK3D_MODULE

View File

@@ -1187,8 +1187,9 @@ InformationChangedCommand NodeInstanceServer::createAllInformationChangedCommand
static bool supportedVariantType(int type)
{
return type < int(QVariant::UserType) && type != QMetaType::QObjectStar
&& type != QMetaType::QModelIndex && type != QMetaType::VoidStar;
return (type < int(QVariant::UserType) && type != QMetaType::QObjectStar
&& type != QMetaType::QModelIndex && type != QMetaType::VoidStar)
|| type == QMetaType::fromType<Enumeration>().id();
}
ValuesChangedCommand NodeInstanceServer::createValuesChangedCommand(const QList<ServerNodeInstance> &instanceList) const

View File

@@ -258,6 +258,7 @@ protected:
void setRenderTimerInterval(int timerInterval);
int renderTimerInterval() const;
void setSlowRenderTimerInterval(int timerInterval);
TimerMode timerMode() const { return m_timerMode; }
virtual void initializeView() = 0;
virtual void initializeAuxiliaryViews();

View File

@@ -6,6 +6,7 @@
#include "qt5bakelightsnodeinstanceserver.h"
#include "qt5captureimagenodeinstanceserver.h"
#include "qt5capturepreviewnodeinstanceserver.h"
#include "qt5import3dnodeinstanceserver.h"
#include "qt5informationnodeinstanceserver.h"
#include "qt5rendernodeinstanceserver.h"
@@ -173,6 +174,8 @@ std::unique_ptr<NodeInstanceServer> createNodeInstanceServer(
return std::make_unique<Qt5PreviewNodeInstanceServer>(nodeInstanceClient);
else if (serverName == "bakelightsmode")
return std::make_unique<Qt5BakeLightsNodeInstanceServer>(nodeInstanceClient);
else if (serverName == "import3dmode")
return std::make_unique<Qt5Import3dNodeInstanceServer>(nodeInstanceClient);
return {};
}

View File

@@ -7,6 +7,7 @@
#include <qmlprivategate.h>
#include <QDebug>
#include <QDir>
#include <QEvent>
#include <QQmlContext>
#include <QQmlError>
@@ -618,7 +619,8 @@ QVariant ObjectNodeInstance::property(const PropertyName &name) const
QQmlProperty property(object(), QString::fromUtf8(name), context());
if (property.property().isEnumType()) {
QVariant value = property.read();
return property.property().enumerator().valueToKey(value.toInt());
QMetaEnum me = property.property().enumerator();
return QVariant::fromValue<Enumeration>(Enumeration(me.scope(), me.valueToKey(value.toInt())));
}
if (property.propertyType() == QVariant::Url) {
@@ -627,8 +629,8 @@ QVariant ObjectNodeInstance::property(const PropertyName &name) const
return QVariant();
if (url.scheme() == "file") {
int basePathLength = nodeInstanceServer()->fileUrl().toLocalFile().lastIndexOf('/');
return QUrl(url.toLocalFile().mid(basePathLength + 1));
QFileInfo fi{nodeInstanceServer()->fileUrl().toLocalFile()};
return QUrl{fi.absoluteDir().relativeFilePath(url.toLocalFile())};
}
}

View File

@@ -0,0 +1,205 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0 WITH Qt-GPL-exception-1.0
#include "qt5import3dnodeinstanceserver.h"
#include "createscenecommand.h"
#include "view3dactioncommand.h"
#include "imagecontainer.h"
#include "nodeinstanceclientinterface.h"
#include "puppettocreatorcommand.h"
#include <QFileInfo>
#include <QLocale>
#include <QQmlComponent>
#include <QQmlEngine>
#include <QQmlProperty>
#include <private/qquick3dnode_p.h>
#include <private/qquick3dviewport_p.h>
#include <private/qquickdesignersupport_p.h>
namespace QmlDesigner {
Qt5Import3dNodeInstanceServer::Qt5Import3dNodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient) :
Qt5NodeInstanceServer(nodeInstanceClient)
{
setSlowRenderTimerInterval(100000000);
setRenderTimerInterval(20);
#ifdef QUICK3D_MODULE
m_generalHelper = new Internal::GeneralHelper();
QObject::connect(m_generalHelper, &Internal::GeneralHelper::requestRender, this, [this]() {
startRenderTimer();
});
#endif
}
Qt5Import3dNodeInstanceServer::~Qt5Import3dNodeInstanceServer()
{
cleanup();
}
void Qt5Import3dNodeInstanceServer::createScene(const CreateSceneCommand &command)
{
initializeView();
registerFonts(command.resourceUrl);
setTranslationLanguage(command.language);
setupScene(command);
startRenderTimer();
}
void Qt5Import3dNodeInstanceServer::view3DAction([[maybe_unused]] const View3DActionCommand &command)
{
switch (command.type()) {
case View3DActionType::Import3dUpdatePreviewImage: {
QObject *obj = rootItem();
if (obj) {
QSize size = command.value().toSize();
QQmlProperty wProp(obj, "width", context());
QQmlProperty hProp(obj, "height", context());
wProp.write(size.width());
hProp.write(size.height());
resizeCanvasToRootItem();
startRenderTimer();
}
break;
}
case View3DActionType::Import3dRotatePreviewModel: {
QObject *obj = rootItem();
QQmlProperty sceneNodeProp(obj, "sceneNode", context());
auto sceneNode = sceneNodeProp.read().value<QQuick3DNode *>();
if (sceneNode) {
QPointF delta = command.value().toPointF();
m_generalHelper->orbitCamera(m_view3D->camera(), m_view3D->camera()->eulerRotation(),
m_lookAt, {}, {float(delta.x()), float(delta.y()), 0.f});
m_keepRendering = true;
startRenderTimer();
}
break;
}
default:
break;
}
}
void Qt5Import3dNodeInstanceServer::startRenderTimer()
{
if (m_keepRendering && timerMode() == TimerMode::NormalTimer)
return;
NodeInstanceServer::startRenderTimer();
}
void Qt5Import3dNodeInstanceServer::cleanup()
{
#ifdef QUICK3D_MODULE
delete m_previewNode;
delete m_generalHelper;
#endif
}
void Qt5Import3dNodeInstanceServer::finish()
{
cleanup();
}
void Qt5Import3dNodeInstanceServer::collectItemChangesAndSendChangeCommands()
{
static bool inFunction = false;
if (!rootNodeInstance().holdsGraphical())
return;
if (!inFunction) {
inFunction = true;
QQuickDesignerSupport::polishItems(quickWindow());
render();
inFunction = false;
}
}
void Qt5Import3dNodeInstanceServer::render()
{
#ifdef QUICK3D_MODULE
++m_renderCount;
if (m_renderCount == 1) {
QObject *obj = rootItem();
QQmlProperty viewProp(obj, "view3d", context());
QObject *viewObj = viewProp.read().value<QObject *>();
m_view3D = qobject_cast<QQuick3DViewport *>(viewObj);
if (m_view3D) {
QQmlProperty sceneModelNameProp(obj, "sceneModelName", context());
QQmlProperty sceneNodeProp(obj, "sceneNode", context());
auto sceneNode = sceneNodeProp.read().value<QQuick3DNode *>();
if (sceneNode) {
QString sceneModelName = sceneModelNameProp.read().toString();
QFileInfo fi(fileUrl().toLocalFile());
QString compPath = fi.absolutePath() + '/' + sceneModelName + ".qml";
QQmlComponent comp(engine(), compPath, QQmlComponent::PreferSynchronous);
m_previewNode = qobject_cast<QQuick3DNode *>(comp.create(context()));
if (m_previewNode) {
engine()->setObjectOwnership(m_previewNode, QJSEngine::CppOwnership);
m_previewNode->setParentItem(sceneNode);
m_previewNode->setParent(sceneNode);
}
}
}
}
// Render scene once to ensure geometries are intialized so bounds calculations work correctly
if (m_renderCount == 2 && m_view3D) {
QVector3D extents;
m_generalHelper->calculateBoundsAndFocusCamera(m_view3D->camera(), m_previewNode,
m_view3D, 1050, false, m_lookAt, extents);
auto getExtentStr = [&extents](int idx) -> QString {
int prec = 0;
float val = extents[idx];
while (val < 100.f) {
++prec;
val *= 10.f;
}
// Strip unnecessary zeroes after decimal separator
if (prec > 0) {
QString checkStr = QString::number(extents[idx], 'f', prec);
while (prec > 0 && (checkStr.last(1) == "0" || checkStr.last(1) == ".")) {
--prec;
checkStr.chop(1);
}
}
QString retval = QLocale().toString(extents[idx], 'f', prec);
return retval;
};
QQmlProperty extentsProp(rootItem(), "extents", context());
extentsProp.write(tr("Dimensions: %1 x %2 x %3").arg(getExtentStr(0))
.arg(getExtentStr(1))
.arg(getExtentStr(2)));
}
rootNodeInstance().updateDirtyNodeRecursive();
QImage renderImage = grabWindow();
if (m_renderCount >= 2) {
ImageContainer imgContainer(0, renderImage, m_renderCount);
nodeInstanceClient()->handlePuppetToCreatorCommand(
{PuppetToCreatorCommand::Import3DPreviewImage,
QVariant::fromValue(imgContainer)});
if (!m_keepRendering)
slowDownRenderTimer();
m_keepRendering = false;
}
#else
slowDownRenderTimer();
#endif
}
} // namespace QmlDesigner

View File

@@ -0,0 +1,48 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0 WITH Qt-GPL-exception-1.0
#pragma once
#include "generalhelper.h"
#include "qt5nodeinstanceserver.h"
QT_BEGIN_NAMESPACE
class QQuick3DNode;
QT_END_NAMESPACE
namespace QmlDesigner {
class Qt5Import3dNodeInstanceServer : public Qt5NodeInstanceServer
{
Q_OBJECT
public:
explicit Qt5Import3dNodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient);
public:
virtual ~Qt5Import3dNodeInstanceServer();
void createScene(const CreateSceneCommand &command) override;
void view3DAction(const View3DActionCommand &command) override;
void render();
protected:
void collectItemChangesAndSendChangeCommands() override;
void startRenderTimer() override;
private:
void finish();
void cleanup();
int m_renderCount = 0;
bool m_keepRendering = false;
#ifdef QUICK3D_MODULE
QQuick3DViewport *m_view3D = nullptr;
Internal::GeneralHelper *m_generalHelper = nullptr;
QQuick3DNode *m_previewNode = nullptr;
QVector3D m_lookAt;
#endif
};
} // namespace QmlDesigner

View File

@@ -41,14 +41,15 @@
#include "changeauxiliarycommand.h"
#include "../editor3d/boxgeometry.h"
#include "../editor3d/generalhelper.h"
#include "../editor3d/mousearea3d.h"
#include "../editor3d/camerageometry.h"
#include "../editor3d/lightgeometry.h"
#include "../editor3d/generalhelper.h"
#include "../editor3d/gridgeometry.h"
#include "../editor3d/selectionboxgeometry.h"
#include "../editor3d/linegeometry.h"
#include "../editor3d/icongizmoimageprovider.h"
#include "../editor3d/lightgeometry.h"
#include "../editor3d/linegeometry.h"
#include "../editor3d/lookatgeometry.h"
#include "../editor3d/mousearea3d.h"
#include "../editor3d/selectionboxgeometry.h"
#include <private/qquickdesignersupport_p.h>
#include <qmlprivategate.h>
@@ -74,6 +75,7 @@
#include <QtQuick3D/private/qquick3dscenerootnode_p.h>
#include <QtQuick3D/private/qquick3drepeater_p.h>
#include <QtQuick3D/private/qquick3dloader_p.h>
#include <QtQuick3D/private/qquick3dreflectionprobe_p.h>
#include <QtQuick3D/private/qquick3dsceneenvironment_p.h>
#if defined(QUICK3D_ASSET_UTILS_MODULE)
#include <private/qquick3druntimeloader_p.h>
@@ -525,6 +527,7 @@ void Qt5InformationNodeInstanceServer::createEditView3D()
qmlRegisterType<QmlDesigner::Internal::SelectionBoxGeometry>("SelectionBoxGeometry", 1, 0, "SelectionBoxGeometry");
qmlRegisterType<QmlDesigner::Internal::LineGeometry>("LineGeometry", 1, 0, "LineGeometry");
qmlRegisterType<QmlDesigner::Internal::BoxGeometry>("BoxGeometry", 1, 0, "BoxGeometry");
qmlRegisterType<QmlDesigner::Internal::LookAtGeometry>("LookAtGeometry", 1, 0, "LookAtGeometry");
auto helper = new QmlDesigner::Internal::GeneralHelper();
QObject::connect(helper, &QmlDesigner::Internal::GeneralHelper::toolStateChanged,
@@ -979,6 +982,9 @@ void Qt5InformationNodeInstanceServer::handleNode3DDestroyed([[maybe_unused]] QO
QMetaObject::invokeMethod(m_editView3DData.rootItem, "releaseParticleEmitterGizmo",
Q_ARG(QVariant, objectToVariant(obj)));
#endif
} else if (qobject_cast<QQuick3DReflectionProbe *>(obj)) {
QMetaObject::invokeMethod(m_editView3DData.rootItem, "releaseReflectionProbeGizmo",
Q_ARG(QVariant, objectToVariant(obj)));
}
removeNode3D(obj);
#endif
@@ -1112,6 +1118,10 @@ void Qt5InformationNodeInstanceServer::resolveSceneRoots()
Q_ARG(QVariant, objectToVariant(newRoot)),
Q_ARG(QVariant, objectToVariant(node)));
#endif
} else if (qobject_cast<QQuick3DReflectionProbe *>(node)) {
QMetaObject::invokeMethod(m_editView3DData.rootItem, "updateReflectionProbeGizmoScene",
Q_ARG(QVariant, objectToVariant(newRoot)),
Q_ARG(QVariant, objectToVariant(node)));
}
}
++it;
@@ -1599,7 +1609,7 @@ QList<ServerNodeInstance> Qt5InformationNodeInstanceServer::createInstances(
if (m_editView3DSetupDone) {
add3DViewPorts(createdInstances);
add3DScenes(createdInstances);
createCameraAndLightGizmos(createdInstances);
createGizmos(createdInstances);
}
render3DEditView();
@@ -1652,13 +1662,14 @@ void Qt5InformationNodeInstanceServer::handleDynamicAddObjectTimeout()
m_dynamicObjectConstructors.clear();
}
void Qt5InformationNodeInstanceServer::createCameraAndLightGizmos(
void Qt5InformationNodeInstanceServer::createGizmos(
const QList<ServerNodeInstance> &instanceList) const
{
QHash<QObject *, QObjectList> cameras;
QHash<QObject *, QObjectList> lights;
QHash<QObject *, QObjectList> particleSystems;
QHash<QObject *, QObjectList> particleEmitters;
QHash<QObject *, QObjectList> reflectionProbes;
for (const ServerNodeInstance &instance : instanceList) {
if (instance.isSubclassOf("QQuick3DCamera")) {
@@ -1671,6 +1682,8 @@ void Qt5InformationNodeInstanceServer::createCameraAndLightGizmos(
|| instance.isSubclassOf("QQuick3DParticleAttractor"))
&& !instance.isSubclassOf("QQuick3DParticleTrailEmitter")) {
particleEmitters[find3DSceneRoot(instance)] << instance.internalObject();
} else if (instance.isSubclassOf("QQuick3DReflectionProbe")) {
reflectionProbes[find3DSceneRoot(instance)] << instance.internalObject();
}
}
@@ -1715,6 +1728,17 @@ void Qt5InformationNodeInstanceServer::createCameraAndLightGizmos(
}
++emitterIt;
}
auto refProbeIt = reflectionProbes.constBegin();
while (refProbeIt != reflectionProbes.constEnd()) {
const auto refProbeObjs = refProbeIt.value();
for (auto &obj : refProbeObjs) {
QMetaObject::invokeMethod(m_editView3DData.rootItem, "addReflectionProbeGizmo",
Q_ARG(QVariant, objectToVariant(refProbeIt.key())),
Q_ARG(QVariant, objectToVariant(obj)));
}
++refProbeIt;
}
}
void Qt5InformationNodeInstanceServer::add3DViewPorts(const QList<ServerNodeInstance> &instanceList)
@@ -1941,6 +1965,8 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(
if (toolStates[helper->globalStateId()].contains(helper->lastSceneIdKey()))
lastSceneId = toolStates[helper->globalStateId()][helper->lastSceneIdKey()].toString();
}
if (toolStates.contains(helper->projectStateId()))
helper->setLastSceneEnvironmentData(toolStates[helper->projectStateId()][helper->lastSceneEnvKey()].toMap());
}
// Find a scene to show
@@ -1977,7 +2003,7 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(
updateActiveSceneToEditView3D();
createCameraAndLightGizmos(instanceList);
createGizmos(instanceList);
// Queue two renders to make sure icon gizmos update properly
render3DEditView(2);
@@ -2509,6 +2535,9 @@ void Qt5InformationNodeInstanceServer::view3DAction(const View3DActionCommand &c
case View3DActionType::ShowGrid:
updatedToolState.insert("showGrid", command.isEnabled());
break;
case View3DActionType::ShowLookAt:
updatedToolState.insert("showLookAt", command.isEnabled());
break;
case View3DActionType::ShowSelectionBox:
updatedToolState.insert("showSelectionBox", command.isEnabled());
break;
@@ -2585,6 +2614,12 @@ void Qt5InformationNodeInstanceServer::view3DAction(const View3DActionCommand &c
case View3DActionType::MaterialOverride:
updatedToolState.insert("matOverride", command.value().toList());
break;
case View3DActionType::SetLastSceneEnvData: {
auto helper = qobject_cast<QmlDesigner::Internal::GeneralHelper *>(m_3dHelper);
if (helper)
helper->setLastSceneEnvironmentData(command.value().toMap());
break;
}
default:
break;

View File

@@ -92,7 +92,7 @@ private:
void create3DPreviewView();
void setup3DEditView(const QList<ServerNodeInstance> &instanceList,
const CreateSceneCommand &command);
void createCameraAndLightGizmos(const QList<ServerNodeInstance> &instanceList) const;
void createGizmos(const QList<ServerNodeInstance> &instanceList) const;
void add3DViewPorts(const QList<ServerNodeInstance> &instanceList);
void add3DScenes(const QList<ServerNodeInstance> &instanceList);
QObject *findView3DForInstance(const ServerNodeInstance &instance) const;

View File

@@ -10,6 +10,7 @@
#include "qt5captureimagenodeinstanceserver.h"
#include "qt5capturepreviewnodeinstanceserver.h"
#include "qt5informationnodeinstanceserver.h"
#include "qt5import3dnodeinstanceserver.h"
#include "qt5previewnodeinstanceserver.h"
#include "qt5rendernodeinstanceserver.h"
#include "qt5testnodeinstanceserver.h"
@@ -70,6 +71,9 @@ Qt5NodeInstanceClientProxy::Qt5NodeInstanceClientProxy(QObject *parent) :
} else if (QCoreApplication::arguments().at(2) == QLatin1String("bakelightsmode")) {
setNodeInstanceServer(std::make_unique<Qt5BakeLightsNodeInstanceServer>(this));
initializeSocket();
} else if (QCoreApplication::arguments().at(2) == QLatin1String("import3dmode")) {
setNodeInstanceServer(std::make_unique<Qt5Import3dNodeInstanceServer>(this));
initializeSocket();
}
}

View File

@@ -7,6 +7,34 @@
#include "runner/qmlruntime.h"
#endif
#include <QLoggingCategory>
inline Q_LOGGING_CATEGORY(deprecated, "qt.tools.qds.deprecated");
inline Q_LOGGING_CATEGORY(verbose1, "qt.tools.qds.verbose1");
inline Q_LOGGING_CATEGORY(verbose2, "qt.tools.qds.verbose2");
void registerMessageHandler(
QtMsgType type, [[maybe_unused]] const QMessageLogContext &context, const QString &msg)
{
auto tPrinter = [&](const QString &msgPrefix) {
fprintf(
stderr, "%s: %s\n", msgPrefix.toLocal8Bit().constData(), msg.toLocal8Bit().constData());
};
if (type == QtDebugMsg)
tPrinter("Debug");
else if (type == QtInfoMsg)
tPrinter("Info");
else if (type == QtWarningMsg)
tPrinter("Warning");
else if (type == QtCriticalMsg)
tPrinter("Critical");
else if (type == QtFatalMsg) {
tPrinter("Fatal");
abort();
}
}
auto getQmlRunner(int &argc, char **argv)
{
#ifdef ENABLE_INTERNAL_QML_RUNTIME
@@ -24,7 +52,6 @@ auto getQmlRunner(int &argc, char **argv)
int main(int argc, char *argv[])
{
QDSMeta::Logging::registerMessageHandler();
QDSMeta::AppInfo::registerAppInfo("Qml2Puppet");
qInstallMessageHandler(registerMessageHandler);
return getQmlRunner(argc, argv)->run();
}

View File

@@ -3,27 +3,12 @@
#pragma once
#include <QDir>
#include <QQmlApplicationEngine>
#include <QQmlComponent>
#include <QQmlContext>
#include <QFileInfo>
#include <QFileOpenEvent>
#include <QLibraryInfo>
#include <QSurfaceFormat>
#include <QApplication>
#include <QCommandLineParser>
#include <QQmlApplicationEngine>
#include <QStandardPaths>
#include <QTranslator>
#include <QSharedPointer>
#include "appmetadata.h"
#include <iostream>
#include <QApplication>
class QmlBase : public QObject
{
Q_OBJECT
@@ -44,7 +29,6 @@ public:
#ifdef ENABLE_INTERNAL_QML_RUNTIME
m_argParser.addOption({"qml-runtime", "Run QML Runtime"});
#endif
m_argParser.addOption({"appinfo", "Print build information"});
m_argParser.addOption({"test", "Run test mode"});
}
@@ -92,7 +76,6 @@ private:
void initParser()
{
QCommandLineOption optHelp = m_argParser.addHelpOption();
QCommandLineOption optVers = m_argParser.addVersionOption();
if (!m_argParser.parse(m_coreApp->arguments())) {
std::cout << "Error: " << m_argParser.errorText().toStdString() << std::endl;
@@ -103,12 +86,8 @@ private:
std::cout << std::endl;
m_argParser.showHelp(1);
} else if (m_argParser.isSet(optVers)) {
m_argParser.showVersion();
} else if (m_argParser.isSet(optHelp)) {
m_argParser.showHelp(0);
} else if (m_argParser.isSet("appinfo")) {
QDSMeta::AppInfo::printAppInfo();
} else if (m_argParser.isSet("test")) {
exit(startTestMode());
}

View File

@@ -10,7 +10,6 @@
#include <app/app_version.h>
#include <qml2puppet/import3d/import3d.h>
#include <qt5nodeinstanceclientproxy.h>
#include <QFileInfo>

View File

@@ -13,6 +13,10 @@
#include <QDirIterator>
#include <QFontDatabase>
#include <QIcon>
#include <QLibraryInfo>
#include <QStandardPaths>
#include <QSurfaceFormat>
#include <QTranslator>
#define FILE_OPEN_EVENT_WAIT_TIME 3000 // ms
#define QSL QStringLiteral
@@ -242,12 +246,12 @@ void QmlRuntime::initQmlRunner()
if (translator.load(translationFile)) {
m_coreApp->installTranslator(&translator);
if (m_verboseMode)
qInfo() << "qml: Loaded translation file %s\n",
qPrintable(QDir::toNativeSeparators(translationFile));
qInfo() << "qml: Loaded translation file "
<< qPrintable(QDir::toNativeSeparators(translationFile));
} else {
if (!m_quietMode)
qInfo() << "qml: Could not load the translation file %s\n",
qPrintable(QDir::toNativeSeparators(translationFile));
qInfo() << "qml: Could not load the translation file "
<< qPrintable(QDir::toNativeSeparators(translationFile));
}
}
#else
@@ -278,7 +282,7 @@ void QmlRuntime::initQmlRunner()
for (const QString &path : std::as_const(files)) {
QUrl url = QUrl::fromUserInput(path, QDir::currentPath(), QUrl::AssumeLocalFile);
if (m_verboseMode)
qInfo() << "qml: loading %s\n", qPrintable(url.toString());
qInfo() << "qml: loading " << qPrintable(url.toString());
m_qmlEngine->load(url);
}
@@ -318,8 +322,8 @@ void QmlRuntime::loadConf(const QString &override, bool quiet) // Terminates app
else
fi.setFile(override);
if (!fi.exists()) {
qCritical() << "qml: Couldn't find required configuration file: %s\n",
qPrintable(QDir::toNativeSeparators(fi.absoluteFilePath()));
qCritical() << "qml: Couldn't find required configuration file:"
<< qPrintable(QDir::toNativeSeparators(fi.absoluteFilePath()));
exit(1);
}
settingsUrl = QQmlImports::urlFromLocalFileOrQrcOrUrl(fi.absoluteFilePath());
@@ -327,13 +331,14 @@ void QmlRuntime::loadConf(const QString &override, bool quiet) // Terminates app
}
if (!quiet) {
qInfo() << "qml: %s\n", QLibraryInfo::build();
qInfo() << "qml:" << QLibraryInfo::build();
if (builtIn) {
qInfo() << "qml: Using built-in configuration: %s\n",
qPrintable(override.isEmpty() ? defaultFileName : override);
qInfo() << "qml: Using built-in configuration:"
<< qPrintable(override.isEmpty() ? defaultFileName : override);
} else {
qInfo() << "qml: Using configuration: %s\n",
qPrintable(settingsUrl.isLocalFile()
qInfo() << "qml: Using configuration:"
<< qPrintable(
settingsUrl.isLocalFile()
? QDir::toNativeSeparators(settingsUrl.toLocalFile())
: settingsUrl.toString());
}
@@ -345,18 +350,19 @@ void QmlRuntime::loadConf(const QString &override, bool quiet) // Terminates app
m_conf.reset(qobject_cast<Config *>(c2.create()));
if (!m_conf) {
qCritical() << "qml: Error loading configuration file: %s\n", qPrintable(c2.errorString());
qCritical() << "qml: Error loading configuration file:" << qPrintable(c2.errorString());
exit(1);
}
}
void QmlRuntime::listConfFiles()
{
qDebug() << "qml: Built-in configurations:";
const QDir confResourceDir(m_confResourcePath);
qInfo() << "%s\n", qPrintable(QCoreApplication::translate("main", "Built-in configurations:"));
qInfo() << qPrintable(QCoreApplication::translate("main", "Built-in configurations:"));
for (const QFileInfo &fi : confResourceDir.entryInfoList(QDir::Files))
qInfo() << " %s\n", qPrintable(fi.baseName());
qInfo() << "%s\n", qPrintable(QCoreApplication::translate("main", "Other configurations:"));
qInfo() << qPrintable(fi.baseName());
qInfo() << qPrintable(QCoreApplication::translate("main", "Other configurations:"));
bool foundOther = false;
const QStringList otherLocations = QStandardPaths::standardLocations(
QStandardPaths::AppConfigLocation);
@@ -365,16 +371,16 @@ void QmlRuntime::listConfFiles()
for (const QFileInfo &fi : confDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot)) {
foundOther = true;
if (m_verboseMode)
qInfo() << " %s\n", qPrintable(fi.absoluteFilePath());
qInfo() << qPrintable(fi.absoluteFilePath());
else
qInfo() << " %s\n", qPrintable(fi.baseName());
qInfo() << qPrintable(fi.baseName());
}
}
if (!foundOther)
qInfo() << " %s\n", qPrintable(QCoreApplication::translate("main", "none"));
qInfo() << qPrintable(QCoreApplication::translate("main", "none"));
if (m_verboseMode) {
qInfo() << "%s\n", qPrintable(QCoreApplication::translate("main", "Checked in:"));
qInfo() << qPrintable(QCoreApplication::translate("main", "Checked in:"));
for (const auto &confDirPath : otherLocations)
qInfo() << " %s\n", qPrintable(confDirPath);
qInfo() << qPrintable(confDirPath);
}
}