forked from qt-creator/qt-creator
		
	Edit camera is now controlled as in Qt 3D Studio: ALT + left button orbits camera. ALT + middle button pans camera. ALT + right button zooms camera. Wheel zooms camera. Task-number: QDS-1206 Change-Id: Ia72644073d172b00483ceed8bcc5ffb8dce68741 Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
		
			
				
	
	
		
			119 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			QML
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			QML
		
	
	
	
	
	
/****************************************************************************
 | 
						|
**
 | 
						|
** 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.12
 | 
						|
import QtQuick3D 1.0
 | 
						|
 | 
						|
Item {
 | 
						|
    id: cameraCtrl
 | 
						|
 | 
						|
    property Camera camera: null
 | 
						|
 | 
						|
    property vector3d _lookAtPoint
 | 
						|
    property vector3d _pressPoint
 | 
						|
    property vector3d _prevPoint
 | 
						|
    property vector3d _startRotation
 | 
						|
    property vector3d _startPosition
 | 
						|
    property vector3d _startLookAtPoint
 | 
						|
    property matrix4x4 _startTransform
 | 
						|
    property bool _dragging
 | 
						|
    property int _button
 | 
						|
    property real _zoomFactor: 1
 | 
						|
    property real _defaultCameraLookAtDistance: 0
 | 
						|
    property Camera _prevCamera: null
 | 
						|
 | 
						|
    function zoomRelative(distance)
 | 
						|
    {
 | 
						|
        _zoomFactor = _generalHelper.zoomCamera(camera, distance, _defaultCameraLookAtDistance,
 | 
						|
                                                _lookAtPoint, _zoomFactor, true);
 | 
						|
    }
 | 
						|
 | 
						|
    Component.onCompleted: {
 | 
						|
        cameraCtrl._defaultCameraLookAtDistance = cameraCtrl.camera.position.length();
 | 
						|
    }
 | 
						|
 | 
						|
    onCameraChanged: {
 | 
						|
        if (_prevCamera) {
 | 
						|
            // Reset zoom on previous camera to ensure it's properties are good to copy to new cam
 | 
						|
            _generalHelper.zoomCamera(_prevCamera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
 | 
						|
                                      1, false);
 | 
						|
 | 
						|
            camera.position = _prevCamera.position;
 | 
						|
            camera.rotation = _prevCamera.rotation;
 | 
						|
 | 
						|
            // Apply correct zoom to new camera
 | 
						|
            _generalHelper.zoomCamera(camera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
 | 
						|
                                      _zoomFactor, false);
 | 
						|
        }
 | 
						|
        _prevCamera = camera;
 | 
						|
    }
 | 
						|
 | 
						|
    MouseArea {
 | 
						|
        id: mouseHandler
 | 
						|
        acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
 | 
						|
        hoverEnabled: false
 | 
						|
        anchors.fill: parent
 | 
						|
        onPositionChanged: {
 | 
						|
            if (mouse.modifiers === Qt.AltModifier && cameraCtrl._dragging) {
 | 
						|
                var currentPoint = Qt.vector3d(mouse.x, mouse.y, 0);
 | 
						|
                if (cameraCtrl._button == Qt.LeftButton) {
 | 
						|
                    _generalHelper.orbitCamera(cameraCtrl.camera, cameraCtrl._startRotation,
 | 
						|
                                               cameraCtrl._lookAtPoint, cameraCtrl._pressPoint,
 | 
						|
                                               currentPoint);
 | 
						|
                } else if (cameraCtrl._button == Qt.MiddleButton) {
 | 
						|
                    cameraCtrl._lookAtPoint = _generalHelper.panCamera(
 | 
						|
                                cameraCtrl.camera, cameraCtrl._startTransform,
 | 
						|
                                cameraCtrl._startPosition, cameraCtrl._startLookAtPoint,
 | 
						|
                                cameraCtrl._pressPoint, currentPoint, _zoomFactor);
 | 
						|
                } else if (cameraCtrl._button == Qt.RightButton) {
 | 
						|
                    cameraCtrl.zoomRelative(currentPoint.y - cameraCtrl._prevPoint.y)
 | 
						|
                    cameraCtrl._prevPoint = currentPoint;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        onPressed: {
 | 
						|
            if (mouse.modifiers === Qt.AltModifier) {
 | 
						|
                cameraCtrl._dragging = true;
 | 
						|
                cameraCtrl._startRotation = cameraCtrl.camera.rotation;
 | 
						|
                cameraCtrl._startPosition = cameraCtrl.camera.position;
 | 
						|
                cameraCtrl._startLookAtPoint = _lookAtPoint;
 | 
						|
                cameraCtrl._pressPoint = Qt.vector3d(mouse.x, mouse.y, 0);
 | 
						|
                cameraCtrl._prevPoint = cameraCtrl._pressPoint;
 | 
						|
                cameraCtrl._button = mouse.button;
 | 
						|
                cameraCtrl._startTransform = cameraCtrl.camera.sceneTransform;
 | 
						|
            } else {
 | 
						|
                mouse.accepted = false;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        onReleased: cameraCtrl._dragging = false;
 | 
						|
        onCanceled: cameraCtrl._dragging = false;
 | 
						|
        onWheel: {
 | 
						|
            // Emprically determined divisor for nice zoom
 | 
						|
            cameraCtrl.zoomRelative(wheel.angleDelta.y / -40);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |