diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index ec358523264a48d8353aef8c1f7bde62d5cf7db8..7e73bdfa123334127a8083887171c71d8e83d09d 100644 --- a/qgroundcontrol.qrc +++ b/qgroundcontrol.qrc @@ -59,6 +59,7 @@ src/QmlControls/QGCCheckBox.qml src/QmlControls/QGCColoredImage.qml src/QmlControls/QGCFlickable.qml + src/QmlControls/QGCPipable.qml src/QmlControls/QGCFlickableVerticalIndicator.qml src/QmlControls/QGCFlickableHorizontalIndicator.qml src/QmlControls/QGCComboBox.qml diff --git a/src/FlightDisplay/FlightDisplayView.qml b/src/FlightDisplay/FlightDisplayView.qml index 3a92eaa7da398c01d5ef9f6b017778e2bb5b1b3b..14d6727d1b3d0bcb649111013a4541d838f8ab41 100644 --- a/src/FlightDisplay/FlightDisplayView.qml +++ b/src/FlightDisplay/FlightDisplayView.qml @@ -47,7 +47,7 @@ Item { readonly property bool isBackgroundDark: _mainIsMap ? (_flightMap ? _flightMap.isSatelliteMap : true) : true - property var _activeVehicle: multiVehicleManager.activeVehicle + property var _activeVehicle: multiVehicleManager.activeVehicle readonly property real _defaultRoll: 0 readonly property real _defaultPitch: 0 @@ -74,145 +74,140 @@ Item { property real _airSpeed: _activeVehicle ? _activeVehicle.airSpeed : _defaultAirSpeed property real _climbRate: _activeVehicle ? _activeVehicle.climbRate : _defaultClimbRate - property var _flightMap: null - property var _flightVideo: null property var _savedZoomLevel: 0 - property real _pipSize: mainWindow.width * 0.2 + property real pipSize: mainWindow.width * 0.2 FlightDisplayViewController { id: _controller } - function reloadContents() { - if(_flightVideo) { - _flightVideo.visible = false - } + function setStates() { if(_mainIsMap) { - mainLoader.source = "FlightDisplayViewMap.qml" - pipLoader.source = "FlightDisplayViewVideo.qml" + //-- Adjust Margins + _flightMapContainer.state = "fullMode" + _flightVideo.state = "pipMode" + //-- Save/Restore Map Zoom Level + if(_savedZoomLevel != 0) + _flightMap.zoomLevel = _savedZoomLevel + else + _savedZoomLevel = _flightMap.zoomLevel } else { - mainLoader.source = "FlightDisplayViewVideo.qml" - pipLoader.source = "FlightDisplayViewMap.qml" + //-- Adjust Margins + _flightMapContainer.state = "pipMode" + _flightVideo.state = "fullMode" + //-- Set Map Zoom Level + _savedZoomLevel = _flightMap.zoomLevel + _flightMap.zoomLevel = _savedZoomLevel - 3 } } - Component.onCompleted: { - reloadContents(); - widgetsLoader.source = "FlightDisplayViewWidgets.qml" + function setPipVisibility(state) { + _isPipVisible = state; + QGroundControl.saveBoolGlobalSetting(_PIPVisibleKey, state) } - //-- Main Window - Loader { - id: mainLoader - anchors.fill: parent - onLoaded: { - if(_mainIsMap) { - _flightMap = item - if(_savedZoomLevel != 0) - _flightMap.zoomLevel = _savedZoomLevel - else - _savedZoomLevel = _flightMap.zoomLevel - } else { - _flightVideo = item - } - } + Component.onCompleted: { + widgetsLoader.source = "FlightDisplayViewWidgets.qml" + setStates() } - //-- PIP Window + //-- Map View + // For whatever reason, if FlightDisplayViewMap is the root item, changing + // width/height has no effect. Item { - id: pip - visible: _controller.hasVideo && _isPipVisible - anchors.margins: ScreenTools.defaultFontPixelHeight - anchors.left: parent.left - anchors.bottom: parent.bottom - width: _pipSize - height: _pipSize * (9/16) - Loader { - id: pipLoader - anchors.fill: parent - onLoaded: { - if(_mainIsMap) { - _flightVideo = item - } else { - _flightMap = item - _savedZoomLevel = _flightMap.zoomLevel - _flightMap.zoomLevel = _savedZoomLevel - 3 + id: _flightMapContainer + z: _mainIsMap ? root.z + 1 : root.z + 2 + anchors.left: root.left + anchors.bottom: root.bottom + visible: _mainIsMap || _isPipVisible + width: _mainIsMap ? root.width : pipSize + height: _mainIsMap ? root.height : pipSize * (9/16) + states: [ + State { + name: "pipMode" + PropertyChanges { + target: _flightMapContainer + anchors.margins: ScreenTools.defaultFontPixelHeight + } + }, + State { + name: "fullMode" + PropertyChanges { + target: _flightMapContainer + anchors.margins: 0 } } + ] + FlightDisplayViewMap { + id: _flightMap + anchors.fill: parent } - MouseArea { - anchors.fill: parent - onClicked: { - _mainIsMap = !_mainIsMap - reloadContents(); - QGroundControl.saveBoolGlobalSetting(_mainIsMapKey, _mainIsMap) - } - } - Image { - id: closePIP - source: "/qmlimages/PiP.svg" - mipmap: true - fillMode: Image.PreserveAspectFit - anchors.left: parent.left - anchors.bottom: parent.bottom - height: ScreenTools.defaultFontPixelSize * 2.5 - width: ScreenTools.defaultFontPixelSize * 2.5 - MouseArea { - anchors.fill: parent - onClicked: { - _isPipVisible = false - QGroundControl.saveBoolGlobalSetting(_PIPVisibleKey, false) + } + + //-- Video View + FlightDisplayViewVideo { + id: _flightVideo + z: _mainIsMap ? root.z + 2 : root.z + 1 + width: !_mainIsMap ? root.width : pipSize + height: !_mainIsMap ? root.height : pipSize * (9/16) + anchors.left: root.left + anchors.bottom: root.bottom + visible: _controller.hasVideo && (!_mainIsMap || _isPipVisible) + states: [ + State { + name: "pipMode" + PropertyChanges { + target: _flightVideo + anchors.margins: ScreenTools.defaultFontPixelHeight + } + }, + State { + name: "fullMode" + PropertyChanges { + target: _flightVideo + anchors.margins: 0 } } - } + ] } - //-- Show PIP - Rectangle { - id: openPIP - anchors.left : parent.left - anchors.bottom: parent.bottom - anchors.margins: ScreenTools.defaultFontPixelHeight - height: ScreenTools.defaultFontPixelSize * 2 - width: ScreenTools.defaultFontPixelSize * 2 - radius: ScreenTools.defaultFontPixelSize / 3 - visible: _controller.hasVideo && !_isPipVisible - color: isBackgroundDark ? Qt.rgba(0,0,0,0.75) : Qt.rgba(0,0,0,0.5) - Image { - width: parent.width * 0.75 - height: parent.height * 0.75 - source: "/res/buttonRight.svg" - mipmap: true - fillMode: Image.PreserveAspectFit - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter + QGCPipable { + id: _flightVideoPipControl + z: _flightVideo.z + 3 + width: pipSize + height: pipSize * (9/16) + anchors.left: root.left + anchors.bottom: root.bottom + anchors.margins: ScreenTools.defaultFontPixelHeight + isHidden: !_isPipVisible + isDark: isBackgroundDark + onActivated: { + _mainIsMap = !_mainIsMap + setStates() } - MouseArea { - anchors.fill: parent - onClicked: { - _isPipVisible = true - QGroundControl.saveBoolGlobalSetting(_PIPVisibleKey, true) - } + onHideIt: { + setPipVisibility(!state) } } //-- Widgets Loader { id: widgetsLoader + z: root.z + 4 anchors.right: parent.right anchors.left: parent.left anchors.bottom: parent.bottom height: availableHeight - property bool isBackgroundDark: root.isBackgroundDark } //-- Virtual Joystick Item { id: multiTouchItem - width: parent.width - (pip.width / 2) + z: root.z + 5 + width: parent.width - (_flightVideoPipControl.width / 2) height: thumbAreaHeight visible: QGroundControl.virtualTabletJoystick - anchors.bottom: pip.top + anchors.bottom: _flightVideoPipControl.top anchors.bottomMargin: ScreenTools.defaultFontPixelHeight * 2 anchors.horizontalCenter: parent.horizontalCenter diff --git a/src/FlightDisplay/FlightDisplayViewWidgets.qml b/src/FlightDisplay/FlightDisplayViewWidgets.qml index 57ae97a8eb63279415b05b43b47711dca9f4ea12..823407ff24cc2e2856e18d280a68eb2c21c93376 100644 --- a/src/FlightDisplay/FlightDisplayViewWidgets.qml +++ b/src/FlightDisplay/FlightDisplayViewWidgets.qml @@ -118,8 +118,8 @@ Item { anchors.margins: ScreenTools.defaultFontPixelHeight anchors.right: parent.right anchors.bottom: parent.bottom - width: _pipSize - height: _pipSize * (9/16) + width: pipSize + height: pipSize * (9/16) color: Qt.rgba(0,0,0,0.75) Column { id: instruments diff --git a/src/FlightDisplay/qmldir b/src/FlightDisplay/qmldir index a7c889fd49fca48c2977a4eb0d096ab319d9d0be..68ea784d7ebd8050175949dc10d5a1b62d48b962 100644 --- a/src/FlightDisplay/qmldir +++ b/src/FlightDisplay/qmldir @@ -1,4 +1,5 @@ Module QGroundControl.FlightDisplay FlightDisplayView 1.0 FlightDisplayView.qml +FlightDisplayViewMap 1.0 FlightDisplayViewMap.qml diff --git a/src/QmlControls/QGCPipable.qml b/src/QmlControls/QGCPipable.qml new file mode 100644 index 0000000000000000000000000000000000000000..29de052b9938273ea73a920312759172bb50ed2c --- /dev/null +++ b/src/QmlControls/QGCPipable.qml @@ -0,0 +1,94 @@ +/*===================================================================== + +QGroundControl Open Source Ground Control Station + +(c) 2009, 2016 QGROUNDCONTROL PROJECT + +This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + QGROUNDCONTROL is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QGROUNDCONTROL. If not, see . + +======================================================================*/ + +import QtQuick 2.5 +import QtQuick.Controls 1.3 + +import QGroundControl 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.Palette 1.0 + +Item { + id: pip + + property bool isHidden: false + property bool isDark: false + + signal activated() + signal hideIt(bool state) + + MouseArea { + anchors.fill: parent + enabled: !isHidden + onClicked: { + pip.activated() + } + } + + //-- PIP Corner Indicator + Image { + id: closePIP + source: "/qmlimages/PiP.svg" + mipmap: true + fillMode: Image.PreserveAspectFit + anchors.left: parent.left + anchors.bottom: parent.bottom + visible: !isHidden + height: ScreenTools.defaultFontPixelSize * 2.5 + width: ScreenTools.defaultFontPixelSize * 2.5 + MouseArea { + anchors.fill: parent + onClicked: { + pip.hideIt(true) + } + } + } + + //-- Show PIP + Rectangle { + id: openPIP + anchors.left : parent.left + anchors.bottom: parent.bottom + height: ScreenTools.defaultFontPixelSize * 2 + width: ScreenTools.defaultFontPixelSize * 2 + radius: ScreenTools.defaultFontPixelSize / 3 + visible: isHidden + color: isDark ? Qt.rgba(0,0,0,0.75) : Qt.rgba(0,0,0,0.5) + Image { + width: parent.width * 0.75 + height: parent.height * 0.75 + source: "/res/buttonRight.svg" + mipmap: true + fillMode: Image.PreserveAspectFit + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + } + MouseArea { + anchors.fill: parent + onClicked: { + pip.hideIt(false) + } + } + } +} diff --git a/src/QmlControls/QGroundControl.Controls.qmldir b/src/QmlControls/QGroundControl.Controls.qmldir index 8484c1444c115f578ac61a1a2c23b1db7004c927..8992d4123ac97a539f70f6b1a69a3c238660e28c 100644 --- a/src/QmlControls/QGroundControl.Controls.qmldir +++ b/src/QmlControls/QGroundControl.Controls.qmldir @@ -21,6 +21,7 @@ QGCComboBox 1.0 QGCComboBox.qml QGCFlickable 1.0 QGCFlickable.qml QGCLabel 1.0 QGCLabel.qml QGCMovableItem 1.0 QGCMovableItem.qml +QGCPipable 1.0 QGCPipable.qml QGCRadioButton 1.0 QGCRadioButton.qml QGCTextField 1.0 QGCTextField.qml QGCToolBarButton 1.0 QGCToolBarButton.qml