Unverified Commit ff3ee095 authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #5825 from DonLakeFlyer/CirclePolygon

Polygon: Create circular polygon
parents 98a3b132 d242b570
......@@ -17,10 +17,10 @@ import QGroundControl.Controls 1.0
/// Use to drag a MissionItemIndicator
Rectangle {
id: itemDragger
x: itemIndicator.x - _touchMarginHorizontal
y: itemIndicator.y - _touchMarginVertical
width: itemIndicator.width + (_touchMarginHorizontal * 2)
height: itemIndicator.height + (_touchMarginVertical * 2)
x: _itemIndicatorX - _touchMarginHorizontal
y: _itemIndicatorY - _touchMarginVertical
width: _itemIndicatorWidth + (_touchMarginHorizontal * 2)
height: _itemIndicatorHeight + (_touchMarginVertical * 2)
color: "transparent"
z: QGroundControl.zOrderMapItems + 1 // Above item icons
......@@ -34,11 +34,15 @@ Rectangle {
property bool _preventCoordinateBindingLoop: false
property real _itemIndicatorX: itemIndicator ? itemIndicator.x : 0
property real _itemIndicatorY: itemIndicator ? itemIndicator.y : 0
property real _itemIndicatorWidth: itemIndicator ? itemIndicator.width : 0
property real _itemIndicatorHeight: itemIndicator ? itemIndicator.height : 0
property bool _mobile: ScreenTools.isMobile
property real _touchWidth: Math.max(itemIndicator.width, ScreenTools.minTouchPixels)
property real _touchHeight: Math.max(itemIndicator.height, ScreenTools.minTouchPixels)
property real _touchMarginHorizontal: _mobile ? (_touchWidth - itemIndicator.width) / 2 : 0
property real _touchMarginVertical: _mobile ? (_touchHeight - itemIndicator.height) / 2 : 0
property real _touchWidth: Math.max(_itemIndicatorWidth, ScreenTools.minTouchPixels)
property real _touchHeight: Math.max(_itemIndicatorHeight, ScreenTools.minTouchPixels)
property real _touchMarginHorizontal: _mobile ? (_touchWidth - _itemIndicatorWidth) / 2 : 0
property real _touchMarginVertical: _mobile ? (_touchHeight - _itemIndicatorHeight) / 2 : 0
property bool _dragStartSignalled: false
onXChanged: liveDrag()
......
......@@ -34,6 +34,8 @@ Item {
property var _dragHandlesComponent
property var _splitHandlesComponent
property var _centerDragHandleComponent
property bool _circle: false
property real _circleRadius
property real _zorderDragHandle: QGroundControl.zOrderMapItems + 3 // Highest to prevent splitting when items overlap
property real _zorderSplitHandle: QGroundControl.zOrderMapItems + 2
......@@ -71,9 +73,8 @@ Item {
}
}
/// Add an initial 4 sided polygon
function addInitialPolygon() {
if (mapPolygon.count < 3) {
/// Calculate the default/initial 4 sided polygon
function defaultPolygonVertices() {
// Initial polygon is inset to take 2/3rds space
var rect = Qt.rect(map.centerViewport.x, map.centerViewport.y, map.centerViewport.width, map.centerViewport.height)
rect.x += (rect.width * 0.25) / 2
......@@ -95,11 +96,54 @@ Item {
bottomLeftCoord = centerCoord.atDistanceAndAzimuth(halfWidthMeters, -90).atDistanceAndAzimuth(halfHeightMeters, 180)
bottomRightCoord = centerCoord.atDistanceAndAzimuth(halfWidthMeters, 90).atDistanceAndAzimuth(halfHeightMeters, 180)
mapPolygon.appendVertex(topLeftCoord)
mapPolygon.appendVertex(topRightCoord)
mapPolygon.appendVertex(bottomRightCoord)
mapPolygon.appendVertex(bottomLeftCoord)
return [ topLeftCoord, topRightCoord, bottomRightCoord, bottomLeftCoord, centerCoord ]
}
/// Add an initial 4 sided polygon
function addInitialPolygon() {
if (mapPolygon.count < 3) {
initialVertices = defaultPolygonVertices()
mapPolygon.appendVertex(initialVertices[0])
mapPolygon.appendVertex(initialVertices[1])
mapPolygon.appendVertex(initialVertices[2])
mapPolygon.appendVertex(initialVertices[3])
}
}
/// Reset polygon back to initial default
function resetPolygon() {
var initialVertices = defaultPolygonVertices()
mapPolygon.clear()
for (var i=0; i<4; i++) {
mapPolygon.appendVertex(initialVertices[i])
}
_circle = false
}
/// Reset polygon to a circle which fits within initial polygon
function setCircleRadius(center, radius) {
var unboundCenter = center.atDistanceAndAzimuth(0, 0)
_circleRadius = radius
var segments = 16
var angleIncrement = 360 / segments
var angle = 0
mapPolygon.clear()
for (var i=0; i<segments; i++) {
var vertex = unboundCenter.atDistanceAndAzimuth(_circleRadius, angle)
mapPolygon.appendVertex(vertex)
angle += angleIncrement
}
_circle = true
}
/// Reset polygon to a circle which fits within initial polygon
function resetCircle() {
var initialVertices = defaultPolygonVertices()
var width = initialVertices[0].distanceTo(initialVertices[1])
var height = initialVertices[1].distanceTo(initialVertices[2])
var radius = Math.min(width, height) / 2
var center = initialVertices[4]
setCircleRadius(center, radius)
}
onInteractiveChanged: {
......@@ -122,6 +166,8 @@ Item {
removeHandles()
}
QGCPalette { id: qgcPal }
Component {
id: polygonComponent
......@@ -141,6 +187,7 @@ Item {
id: mapQuickItem
anchorPoint.x: dragHandle.width / 2
anchorPoint.y: dragHandle.height / 2
visible: !_circle
property int vertexIndex
......@@ -149,7 +196,8 @@ Item {
width: ScreenTools.defaultFontPixelHeight * 1.5
height: width
radius: width / 2
color: "white"
border.color: "white"
color: "transparent"
opacity: .50
z: _zorderSplitHandle
......@@ -210,6 +258,7 @@ Item {
MissionItemIndicatorDrag {
id: dragArea
z: _zorderDragHandle
visible: !_circle
property int polygonVertex
......@@ -219,15 +268,44 @@ Item {
onItemCoordinateChanged: {
if (_creationComplete) {
// During component creation some bad coordinate values got through which screws up polygon draw
// During component creation some bad coordinate values got through which screws up draw
mapPolygon.adjustVertex(polygonVertex, itemCoordinate)
}
}
onDragStop: adjustCircleRadius(itemCoordinate)
onClicked: mapPolygon.removeVertex(polygonVertex)
}
}
Component {
id: centerDragHandle
MapQuickItem {
id: mapQuickItem
anchorPoint.x: dragHandle.width / 2
anchorPoint.y: dragHandle.height / 2
z: _zorderDragHandle
sourceItem: Rectangle {
id: dragHandle
width: ScreenTools.defaultFontPixelHeight * 1.5
height: width
radius: width / 2
color: "white"
opacity: .90
QGCLabel {
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
text: "..."
color: "black"
}
}
}
}
Component {
id: dragHandleComponent
......@@ -236,6 +314,9 @@ Item {
anchorPoint.x: dragHandle.width / 2
anchorPoint.y: dragHandle.height / 2
z: _zorderDragHandle
visible: !_circle
property int polygonVertex
sourceItem: Rectangle {
id: dragHandle
......@@ -261,6 +342,7 @@ Item {
Component.onCompleted: {
var dragHandle = dragHandleComponent.createObject(mapControl)
dragHandle.coordinate = Qt.binding(function() { return object.coordinate })
dragHandle.polygonVertex = Qt.binding(function() { return index })
mapControl.addMapItem(dragHandle)
var dragArea = dragAreaComponent.createObject(mapControl, { "itemIndicator": dragHandle, "itemCoordinate": object.coordinate })
dragArea.polygonVertex = Qt.binding(function() { return index })
......@@ -286,6 +368,75 @@ Item {
onItemCoordinateChanged: mapPolygon.center = itemCoordinate
onDragStart: mapPolygon.centerDrag = true
onDragStop: mapPolygon.centerDrag = false
onClicked: menu.popup()
function setRadiusFromDialog() {
setCircleRadius(mapPolygon.center, radiusField.text)
radiusDialog.visible = false
}
Menu {
id: menu
MenuItem {
text: qsTr("Circle" )
onTriggered: resetCircle()
}
MenuItem {
text: qsTr("Polygon")
onTriggered: resetPolygon()
}
MenuItem {
text: qsTr("Set radius..." )
enabled: _circle
onTriggered: radiusDialog.visible = true
}
MenuItem {
text: qsTr("Load KML...")
enabled: false
}
}
Rectangle {
id: radiusDialog
anchors.margins: _margin
anchors.left: parent.right
width: radiusColumn.width + (_margin *2)
height: radiusColumn.height + (_margin *2)
color: qgcPal.window
border.color: qgcPal.text
visible: false
Column {
id: radiusColumn
anchors.margins: _margin
anchors.left: parent.left
anchors.top: parent.top
spacing: _margin
QGCLabel { text: qsTr("Radius:") }
QGCTextField {
id: radiusField
text: _circleRadius.toFixed(2)
onEditingFinished: setRadiusFromDialog()
}
}
QGCLabel {
anchors.right: radiusColumn.right
anchors.top: radiusColumn.top
text: "X"
QGCMouseArea {
fillItem: parent
onClicked: setRadiusFromDialog()
}
}
}
}
}
......@@ -297,7 +448,7 @@ Item {
property var dragArea
Component.onCompleted: {
dragHandle = dragHandleComponent.createObject(mapControl)
dragHandle = centerDragHandle.createObject(mapControl)
dragHandle.coordinate = Qt.binding(function() { return mapPolygon.center })
mapControl.addMapItem(dragHandle)
dragArea = centerDragAreaComponent.createObject(mapControl, { "itemIndicator": dragHandle, "itemCoordinate": mapPolygon.center })
......
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