Commit fa4e7a2c authored by Don Gagne's avatar Don Gagne

Merge pull request #1847 from DonLakeFlyer/ControlReorg

Restructure map controls for better reusability
parents 4719c514 d1285c18
......@@ -25,12 +25,13 @@ import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Controls.Styles 1.2
import QtQuick.Dialogs 1.2
import QtLocation 5.3
import QGroundControl.FlightMap 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Controls 1.0
import QGroundControl.Palette 1.0
import QGroundControl.Vehicle 1.0
/// Flight Display View
Item {
......@@ -76,9 +77,70 @@ Item {
mapName: "FlightDisplayView"
latitude: parent._latitude
longitude: parent._longitude
z: 10
showVehicles: true
showMissionItems: true
// Add the vehicles to the map
MapItemView {
model: multiVehicleManager.vehicles
delegate:
VehicleMapItem {
vehicle: object
coordinate: object.coordinate
isSatellite: flightMap.isSatelliteMap
}
}
// Add the mission items to the map
MapItemView {
model: multiVehicleManager.activeVehicle ? multiVehicleManager.activeVehicle.missionItems : 0
delegate:
MissionMapItem {
missionItem: object
}
}
// Vehicle GPS lock display
Column {
id: gpsLockColumn
y: (parent.height - height) / 2
width: parent.width
Repeater {
model: multiVehicleManager.vehicles
delegate:
QGCLabel {
width: gpsLockColumn.width
horizontalAlignment: Text.AlignHCenter
visible: object.satelliteLock < 2
text: "No GPS Lock for Vehicle #" + object.id
}
}
}
// Mission item list
ListView {
id: missionItemSummaryList
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.left: parent.left
anchors.right: flightMap.mapWidgets.left
anchors.bottom: parent.bottom
height: ScreenTools.defaultFontPixelHeight * 7
spacing: ScreenTools.defaultFontPixelWidth / 2
opacity: 0.75
orientation: ListView.Horizontal
model: multiVehicleManager.activeVehicle ? multiVehicleManager.activeVehicle.missionItems : 0
property real _maxItemHeight: 0
delegate:
MissionItemSummary {
opacity: 0.75
missionItem: object
}
} // ListView - Mission item list
}
QGCCompassWidget {
......
......@@ -39,256 +39,30 @@ import QGroundControl.MultiVehicleManager 1.0
import QGroundControl.Vehicle 1.0
import QGroundControl.Mavlink 1.0
Item {
id: root
clip: true
Map {
id: _map
property real latitude: 0
property real longitude: 0
property real zoomLevel: 18
property real heading: 0
property bool interactive: true
property string mapName: 'defaultMap'
property alias mapItem: map
property alias mapMenu: mapTypeMenu
property bool showVehicles: false
property bool showMissionItems: false
property alias mapWidgets: controlWidgets
property bool isSatelliteMap: false
property real lon: (longitude >= -180 && longitude <= 180) ? longitude : 0
property real lat: (latitude >= -90 && latitude <= 90) ? latitude : 0
Component.onCompleted: {
map.zoomLevel = 18
mapTypeMenu.update();
}
//-- Menu to select supported map types
Menu {
id: mapTypeMenu
title: "Map Type..."
enabled: root.visible
ExclusiveGroup { id: currMapType }
function setCurrentMap(mapID) {
for (var i = 0; i < map.supportedMapTypes.length; i++) {
if (mapID === map.supportedMapTypes[i].name) {
map.activeMapType = map.supportedMapTypes[i]
multiVehicleManager.saveSetting(root.mapName + "/currentMapType", mapID);
return;
}
}
}
function addMap(mapID, checked) {
var mItem = mapTypeMenu.addItem(mapID);
mItem.checkable = true
mItem.checked = checked
mItem.exclusiveGroup = currMapType
var menuSlot = function() {setCurrentMap(mapID);};
mItem.triggered.connect(menuSlot);
}
function update() {
clear()
var mapID = ''
if (map.supportedMapTypes.length > 0)
mapID = map.activeMapType.name;
mapID = multiVehicleManager.loadSetting(root.mapName + "/currentMapType", mapID);
for (var i = 0; i < map.supportedMapTypes.length; i++) {
var name = map.supportedMapTypes[i].name;
addMap(name, mapID === name);
}
if(mapID != '')
setCurrentMap(mapID);
}
}
function adjustSize() {
if(root.visible) {
if(true /*alwaysNorth*/) {
map.width = root.width;
map.height = root.height;
} else {
var diag = Math.ceil(Math.sqrt((root.width * root.width) + (root.height * root.height)));
map.width = diag;
map.height = diag;
}
} else {
map.width = 1;
map.height = 1;
}
}
/*
function formatDistance(meters)
{
var dist = Math.round(meters)
if (dist > 1000 ){
if (dist > 100000){
dist = Math.round(dist / 1000)
}
else{
dist = Math.round(dist / 100)
dist = dist / 10
}
dist = dist + " km"
}
else{
dist = dist + " m"
}
return dist
}
*/
Plugin {
id: mapPlugin
name: "QGroundControl"
}
Map {
id: map
property real lon: (longitude >= -180 && longitude <= 180) ? longitude : 0
property real lat: (latitude >= -90 && latitude <= 90) ? latitude : 0
property int currentMarker
property int pressX : -1
property int pressY : -1
property bool changed: false
property variant scaleLengths: [5, 10, 25, 50, 100, 150, 250, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000, 1000000, 2000000]
plugin: mapPlugin
width: 1
height: 1
zoomLevel: root.zoomLevel
anchors.centerIn: parent
center: QtPositioning.coordinate(lat, lon)
gesture.flickDeceleration: 3000
gesture.enabled: root.interactive
// Add the vehicles to the map
MapItemView {
model: showVehicles ? multiVehicleManager.vehicles : 0
delegate:
VehicleMapItem {
vehicle: object
isSatellite: root.isSatelliteMap
}
}
// Add the mission items to the map
MapItemView {
model: showMissionItems ? (multiVehicleManager.activeVehicle ? multiVehicleManager.activeVehicle.missionItems : 0) : 0
delegate:
MissionMapItem {
missionItem: object
}
}
/*
onWidthChanged: {
scaleTimer.restart()
}
onHeightChanged: {
scaleTimer.restart()
}
onZoomLevelChanged:{
scaleTimer.restart()
}
*/
MouseArea {
anchors.fill: parent
onDoubleClicked: {
var coord = map.toCoordinate(Qt.point(mouse.x, mouse.y));
map.addMarker(coord, polyLine.path.length);
polyLine.addCoordinate(coord);
map.changed = true;
}
}
/*
function calculateScale() {
var coord1, coord2, dist, text, f
f = 0
coord1 = map.toCoordinate(Qt.point(0,scale.y))
coord2 = map.toCoordinate(Qt.point(0+scaleImage.sourceSize.width,scale.y))
dist = Math.round(coord1.distanceTo(coord2))
if (dist === 0) {
// not visible
} else {
for (var i = 0; i < scaleLengths.length-1; i++) {
if (dist < (scaleLengths[i] + scaleLengths[i+1]) / 2 ) {
f = scaleLengths[i] / dist
dist = scaleLengths[i]
break;
}
}
if (f === 0) {
f = dist / scaleLengths[i]
dist = scaleLengths[i]
}
}
text = formatDistance(dist)
scaleImage.width = (scaleImage.sourceSize.width * f) - 2 * scaleImageLeft.sourceSize.width
scaleText.text = text
}
*/
}
// Vehicle GPS lock display
Column {
id: gpsLockColumn
y: (parent.height - height) / 2
width: parent.width
Repeater {
model: multiVehicleManager.vehicles
delegate:
QGCLabel {
width: gpsLockColumn.width
horizontalAlignment: Text.AlignHCenter
visible: object.satelliteLock < 2
text: "No GPS Lock for Vehicle #" + object.id
}
}
}
// Mission item list
ListView {
id: missionItemSummaryList
anchors.margins: ScreenTools.defaultFontPixelWidth
anchors.left: parent.left
anchors.right: controlWidgets.left
anchors.bottom: parent.bottom
height: ScreenTools.defaultFontPixelHeight * 7
spacing: ScreenTools.defaultFontPixelWidth / 2
opacity: 0.75
orientation: ListView.Horizontal
model: multiVehicleManager.activeVehicle ? multiVehicleManager.activeVehicle.missionItems : 0
anchors.fill: parent
zoomLevel: 18
center: QtPositioning.coordinate(lat, lon)
gesture.flickDeceleration: 3000
gesture.enabled: interactive
property real _maxItemHeight: 0
plugin: Plugin { name: "QGroundControl" }
delegate:
MissionItemSummary {
opacity: 0.75
missionItem: object
}
}
// This is used to determine the height of a horizontal scroll bar
ScrollView {
id: scrollBarHeight
x: 10000
y: 10000
width: 100
height: 100
Rectangle {
height: 50
width: 200
}
}
Component.onCompleted: mapTypeMenu.update()
/// Map control widgets
Column {
......@@ -298,6 +72,44 @@ Item {
anchors.bottom: parent.bottom
spacing: ScreenTools.defaultFontPixelWidth / 2
//-- Menu to select supported map types
Menu {
id: mapTypeMenu
title: "Map Type..."
enabled: root.visible
ExclusiveGroup { id: currMapType }
function setCurrentMap(mapID) {
for (var i = 0; i < _map.supportedMapTypes.length; i++) {
if (mapID === _map.supportedMapTypes[i].name) {
_map.activeMapType = _map.supportedMapTypes[i]
multiVehicleManager.saveSetting(root.mapName + "/currentMapType", mapID);
return;
}
}
}
function addMap(mapID, checked) {
var mItem = mapTypeMenu.addItem(mapID);
mItem.checkable = true
mItem.checked = checked
mItem.exclusiveGroup = currMapType
var menuSlot = function() {setCurrentMap(mapID);};
mItem.triggered.connect(menuSlot);
}
function update() {
clear()
var mapID = ''
if (_map.supportedMapTypes.length > 0)
mapID = _map.activeMapType.name;
mapID = multiVehicleManager.loadSetting(root.mapName + "/currentMapType", mapID);
for (var i = 0; i < _map.supportedMapTypes.length; i++) {
var name = _map.supportedMapTypes[i].name;
addMap(name, mapID === name);
}
if(mapID != '')
setCurrentMap(mapID);
}
}
QGCButton {
id: optionsButton
text: "Options"
......@@ -317,7 +129,7 @@ Item {
property real startZoom
property real endZoom
target: map
target: _map
properties: "zoomLevel"
from: startZoom
to: endZoom
......@@ -334,11 +146,11 @@ Item {
text: "+"
onClicked: {
var endZoomLevel = map.zoomLevel + parent._zoomIncrement
if (endZoomLevel > map.maximumZoomLevel) {
endZoomLevel = map.maximumZoomLevel
var endZoomLevel = _map.zoomLevel + parent._zoomIncrement
if (endZoomLevel > _map.maximumZoomLevel) {
endZoomLevel = _map.maximumZoomLevel
}
animateZoom.startZoom = map.zoomLevel
animateZoom.startZoom = _map.zoomLevel
animateZoom.endZoom = endZoomLevel
animateZoom.start()
}
......@@ -349,22 +161,80 @@ Item {
text: "-"
onClicked: {
var endZoomLevel = map.zoomLevel - parent._zoomIncrement
if (endZoomLevel < map.minimumZoomLevel) {
endZoomLevel = map.minimumZoomLevel
var endZoomLevel = _map.zoomLevel - parent._zoomIncrement
if (endZoomLevel < _map.minimumZoomLevel) {
endZoomLevel = _map.minimumZoomLevel
}
animateZoom.startZoom = map.zoomLevel
animateZoom.startZoom = _map.zoomLevel
animateZoom.endZoom = endZoomLevel
animateZoom.start()
}
}
} // Row - +/- buttons
} // Column - Map control widgets
/*
The slider and scale display are commented out for now to try to save real estate - DonLakeFlyer
Not sure if I'll bring them back or not. Need room for waypoint list at bottom
property variant scaleLengths: [5, 10, 25, 50, 100, 150, 250, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000, 1000000, 2000000]
function formatDistance(meters)
{
var dist = Math.round(meters)
if (dist > 1000 ){
if (dist > 100000){
dist = Math.round(dist / 1000)
}
else{
dist = Math.round(dist / 100)
dist = dist / 10
}
dist = dist + " km"
}
else{
dist = dist + " m"
}
return dist
}
/*
onWidthChanged: {
scaleTimer.restart()
}
The slider and scale display are commented out for now to try to save real estate - DonLakeFlyer
Not sure if I'll bring them back or not. Need room for waypoint list at bottom
onHeightChanged: {
scaleTimer.restart()
}
onZoomLevelChanged:{
scaleTimer.restart()
}
function calculateScale() {
var coord1, coord2, dist, text, f
f = 0
coord1 = map.toCoordinate(Qt.point(0,scale.y))
coord2 = map.toCoordinate(Qt.point(0+scaleImage.sourceSize.width,scale.y))
dist = Math.round(coord1.distanceTo(coord2))
if (dist === 0) {
// not visible
} else {
for (var i = 0; i < scaleLengths.length-1; i++) {
if (dist < (scaleLengths[i] + scaleLengths[i+1]) / 2 ) {
f = scaleLengths[i] / dist
dist = scaleLengths[i]
break;
}
}
if (f === 0) {
f = dist / scaleLengths[i]
dist = scaleLengths[i]
}
}
text = formatDistance(dist)
scaleImage.width = (scaleImage.sourceSize.width * f) - 2 * scaleImageLeft.sourceSize.width
scaleText.text = text
}
QGCSlider {
id: zoomSlider;
......@@ -445,16 +315,4 @@ Not sure if I'll bring them back or not. Need room for waypoint list at bottom
}
}
*/
onVisibleChanged: {
adjustSize();
}
onWidthChanged: {
adjustSize();
}
onHeightChanged: {
adjustSize();
}
}
} // Map
......@@ -24,8 +24,9 @@ This file is part of the QGROUNDCONTROL project
/// @file
/// @author Don Gagne <don@thegagnes.com>
import QtQuick 2.4
import QtLocation 5.3
import QtQuick 2.4
import QtLocation 5.3
import QtPositioning 5.3
import QGroundControl.ScreenTools 1.0
import QGroundControl.Vehicle 1.0
......@@ -37,7 +38,6 @@ MapQuickItem {
anchorPoint.x: vehicleIcon.width / 2
anchorPoint.y: vehicleIcon.height / 2
coordinate: vehicle.coordinate
visible: vehicle.satelliteLock >= 2 // 2D lock
sourceItem: Image {
......
......@@ -729,6 +729,7 @@ void Vehicle::_waypointViewOnlyListChanged()
for(int i = 0; i < newMisionItems.count(); i++) {
MissionItem* itemToCopy = newMisionItems[i];
MissionItem* item = new MissionItem(*itemToCopy);
item->setParent(this);
_missionItems.append(item);
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment