Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
qgroundcontrol
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Valentin Platzgummer
qgroundcontrol
Commits
b14e1a46
Commit
b14e1a46
authored
Oct 26, 2015
by
dogmaphobic
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Done with first pass of the Flight View re-work.
parent
a9a17e88
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
375 additions
and
336 deletions
+375
-336
qgroundcontrol.qrc
qgroundcontrol.qrc
+4
-1
FlightDisplayView.qml
src/FlightDisplay/FlightDisplayView.qml
+80
-112
FlightDisplayViewWidgets.qml
src/FlightDisplay/FlightDisplayViewWidgets.qml
+202
-0
qmldir
src/FlightDisplay/qmldir
+0
-1
FlightMap.qml
src/FlightMap/FlightMap.qml
+3
-1
ZoomMinus.svg
src/FlightMap/Images/ZoomMinus.svg
+11
-5
ZoomPlus.svg
src/FlightMap/Images/ZoomPlus.svg
+9
-4
VehicleMapItem.qml
src/FlightMap/MapItems/VehicleMapItem.qml
+4
-3
QGCInstrumentWidget.qml
src/FlightMap/Widgets/QGCInstrumentWidget.qml
+48
-8
MissionEditor.qml
src/MissionEditor/MissionEditor.qml
+14
-201
No files found.
qgroundcontrol.qrc
View file @
b14e1a46
...
@@ -77,11 +77,14 @@
...
@@ -77,11 +77,14 @@
<file alias="FlightDisplayView.qml">src/FlightDisplay/FlightDisplayView.qml</file>
<file alias="FlightDisplayView.qml">src/FlightDisplay/FlightDisplayView.qml</file>
<file alias="FlightDisplayWidget.qml">src/FlightDisplay/FlightDisplayWidget.qml</file>
<file alias="FlightDisplayWidget.qml">src/FlightDisplay/FlightDisplayWidget.qml</file>
<file alias="MissionEditor.qml">src/MissionEditor/MissionEditor.qml</file>
<file alias="MissionEditor.qml">src/MissionEditor/MissionEditor.qml</file>
<file alias="MissionEditorHelp.qml">src/MissionEditor/MissionEditorHelp.qml</file>
<!-- FlightDisplay module -->
<!-- FlightDisplay module -->
<file alias="QGroundControl/FlightDisplay/qmldir">src/FlightDisplay/qmldir</file>
<file alias="QGroundControl/FlightDisplay/qmldir">src/FlightDisplay/qmldir</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayView.qml">src/FlightDisplay/FlightDisplayView.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayView.qml">src/FlightDisplay/FlightDisplayView.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayViewDelayLoad.qml">src/FlightDisplay/FlightDisplayViewDelayLoad.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayViewMap.qml">src/FlightDisplay/FlightDisplayViewMap.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayViewVideo.qml">src/FlightDisplay/FlightDisplayViewVideo.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayViewWidgets.qml">src/FlightDisplay/FlightDisplayViewWidgets.qml</file>
<!-- FlightMap module -->
<!-- FlightMap module -->
<file alias="QGroundControl/FlightMap/qmldir">src/FlightMap/qmldir</file>
<file alias="QGroundControl/FlightMap/qmldir">src/FlightMap/qmldir</file>
...
...
src/FlightDisplay/FlightDisplayView.qml
View file @
b14e1a46
...
@@ -41,16 +41,6 @@ import QGroundControl.Controllers 1.0
...
@@ -41,16 +41,6 @@ import QGroundControl.Controllers 1.0
Item
{
Item
{
id
:
root
id
:
root
property
alias
latitude
:
flightMap
.
latitude
property
alias
longitude
:
flightMap
.
longitude
// Top margin for all widgets. Used to prevent overlap with the toolbar
property
real
topMargin
:
0
// Used by parent to hide widgets when it displays something above in the z order.
// Prevents z order drawing problems.
property
bool
hideWidgets
:
false
QGCPalette
{
id
:
qgcPal
;
colorGroupEnabled
:
enabled
}
QGCPalette
{
id
:
qgcPal
;
colorGroupEnabled
:
enabled
}
property
var
_activeVehicle
:
multiVehicleManager
.
activeVehicle
property
var
_activeVehicle
:
multiVehicleManager
.
activeVehicle
...
@@ -64,139 +54,117 @@ Item {
...
@@ -64,139 +54,117 @@ Item {
readonly
property
real
_defaultAirSpeed
:
0
readonly
property
real
_defaultAirSpeed
:
0
readonly
property
real
_defaultClimbRate
:
0
readonly
property
real
_defaultClimbRate
:
0
readonly
property
string
_mapName
:
"
FlightDisplayView
"
readonly
property
string
_mapName
:
"
FlightDisplayView
"
readonly
property
string
_showMapBackgroundKey
:
"
/showMapBackground
"
readonly
property
string
_showMapBackgroundKey
:
"
/showMapBackground
"
readonly
property
var
_flightMap
:
flightMap
property
bool
_mainIsMap
:
!
_controller
.
hasVideo
property
real
_roll
:
_activeVehicle
?
(
isNaN
(
_activeVehicle
.
roll
)
?
_defaultRoll
:
_activeVehicle
.
roll
)
:
_defaultRoll
property
real
_roll
:
_activeVehicle
?
(
isNaN
(
_activeVehicle
.
roll
)
?
_defaultRoll
:
_activeVehicle
.
roll
)
:
_defaultRoll
property
real
_pitch
:
_activeVehicle
?
(
isNaN
(
_activeVehicle
.
pitch
)
?
_defaultPitch
:
_activeVehicle
.
pitch
)
:
_defaultPitch
property
real
_pitch
:
_activeVehicle
?
(
isNaN
(
_activeVehicle
.
pitch
)
?
_defaultPitch
:
_activeVehicle
.
pitch
)
:
_defaultPitch
property
real
_heading
:
_activeVehicle
?
(
isNaN
(
_activeVehicle
.
heading
)
?
_defaultHeading
:
_activeVehicle
.
heading
)
:
_defaultHeading
property
real
_heading
:
_activeVehicle
?
(
isNaN
(
_activeVehicle
.
heading
)
?
_defaultHeading
:
_activeVehicle
.
heading
)
:
_defaultHeading
property
var
_vehicleCoordinate
:
_activeVehicle
?
(
_activeVehicle
.
coordinateValid
?
_activeVehicle
.
coordinate
:
_defaultVehicleCoordinate
)
:
_defaultVehicleCoordinate
property
var
_vehicleCoordinate
:
_activeVehicle
?
(
_activeVehicle
.
coordinateValid
?
_activeVehicle
.
coordinate
:
_defaultVehicleCoordinate
)
:
_defaultVehicleCoordinate
property
real
_altitudeWGS84
:
_activeVehicle
?
_activeVehicle
.
altitudeWGS84
:
_defaultAltitudeWGS84
property
real
_altitudeWGS84
:
_activeVehicle
?
_activeVehicle
.
altitudeWGS84
:
_defaultAltitudeWGS84
property
real
_groundSpeed
:
_activeVehicle
?
_activeVehicle
.
groundSpeed
:
_defaultGroundSpeed
property
real
_groundSpeed
:
_activeVehicle
?
_activeVehicle
.
groundSpeed
:
_defaultGroundSpeed
property
real
_airSpeed
:
_activeVehicle
?
_activeVehicle
.
airSpeed
:
_defaultAirSpeed
property
real
_airSpeed
:
_activeVehicle
?
_activeVehicle
.
airSpeed
:
_defaultAirSpeed
property
real
_climbRate
:
_activeVehicle
?
_activeVehicle
.
climbRate
:
_defaultClimbRate
property
real
_climbRate
:
_activeVehicle
?
_activeVehicle
.
climbRate
:
_defaultClimbRate
property
bool
_showMap
:
getBool
(
QGroundControl
.
flightMapSettings
.
loadMapSetting
(
flightMap
.
mapName
,
_showMapBackgroundKey
,
"
1
"
))
property
var
_flightMap
:
null
property
var
_flightVideo
:
null
property
var
_savedZoomLevel
:
0
FlightDisplayViewController
{
id
:
_controller
}
FlightDisplayViewController
{
id
:
_controller
}
MissionController
{
MissionController
{
id
:
_missionController
id
:
_missionController
Component.onCompleted
:
start
(
false
/* editMode */
)
Component.onCompleted
:
start
(
false
/* editMode */
)
}
}
ExclusiveGroup
{
function
reloadContents
()
{
id
:
_dropButtonsExclusiveGroup
if
(
_flightVideo
)
{
_flightVideo
.
visible
=
false
}
if
(
_mainIsMap
)
{
mainLoader
.
source
=
"
FlightDisplayViewMap.qml
"
pipLoader
.
source
=
"
FlightDisplayViewVideo.qml
"
}
else
{
mainLoader
.
source
=
"
FlightDisplayViewVideo.qml
"
pipLoader
.
source
=
"
FlightDisplayViewMap.qml
"
}
}
}
// Validate _showMap setting
Component.onCompleted
:
{
Component.onCompleted
:
{
delayLoader
.
source
=
"
FlightDisplayViewDelayLoad.qml
"
reloadContents
();
widgetsLoader
.
source
=
"
FlightDisplayViewWidgets.qml
"
// We have to be careful to not reference root properties in a function which is in a subcomponent
// until the root component has completed loading. Otherwise you get undefined references.
flightMap
.
rootLoadCompleted
=
true
flightMap
.
updateMapPosition
(
true
/* force */
)
_setShowMap
(
_showMap
)
}
function
getBool
(
value
)
{
return
value
===
'
0
'
?
false
:
true
;
}
}
function
setBool
(
value
)
{
//-- Main Window
return
value
?
"
1
"
:
"
0
"
;
Loader
{
}
id
:
mainLoader
anchors.fill
:
parent
function
_setShowMap
(
showMap
)
{
onLoaded
:
{
_showMap
=
_controller
.
hasVideo
?
showMap
:
true
if
(
_mainIsMap
)
{
QGroundControl
.
flightMapSettings
.
saveMapSetting
(
flightMap
.
mapName
,
_showMapBackgroundKey
,
setBool
(
_showMap
))
_flightMap
=
item
}
if
(
_savedZoomLevel
!=
0
)
_flightMap
.
zoomLevel
=
_savedZoomLevel
FlightMap
{
else
id
:
flightMap
_savedZoomLevel
=
_flightMap
.
zoomLevel
anchors.fill
:
parent
_flightMap
.
updateMapPosition
(
true
/* force */
)
mapName
:
_mapName
}
else
{
visible
:
_showMap
_flightVideo
=
item
latitude
:
root
.
_defaultCoordinate
.
latitude
_flightVideo
.
visible
=
true
longitude
:
root
.
_defaultCoordinate
.
longitude
property
var
rootVehicleCoordinate
:
_vehicleCoordinate
property
bool
rootLoadCompleted
:
false
property
bool
_followVehicle
:
true
onRootVehicleCoordinateChanged
:
updateMapPosition
(
false
/* force */
)
function
updateMapPosition
(
force
)
{
if
((
_followVehicle
||
force
)
&&
rootLoadCompleted
)
{
flightMap
.
latitude
=
root
.
_vehicleCoordinate
.
latitude
flightMap
.
longitude
=
root
.
_vehicleCoordinate
.
longitude
}
}
}
}
}
// Home position
//-- PIP Window
MissionItemIndicator
{
Rectangle
{
label
:
"
H
"
id
:
pip
coordinate
:
(
_activeVehicle
&&
_activeVehicle
.
homePositionAvailable
)
?
_activeVehicle
.
homePosition
:
QtPositioning
.
coordinate
(
0
,
0
)
visible
:
_controller
.
hasVideo
visible
:
_activeVehicle
?
_activeVehicle
.
homePositionAvailable
:
false
anchors.margins
:
ScreenTools
.
defaultFontPixelHeight
z
:
QGroundControl
.
zOrderMapItems
anchors.left
:
parent
.
left
}
anchors.bottom
:
parent
.
bottom
height
:
ScreenTools
.
defaultFontPixelSize
*
(
9
)
// Add trajectory points to the map
width
:
ScreenTools
.
defaultFontPixelSize
*
(
9
)
*
(
16
/
9
)
MapItemView
{
color
:
"
#000010
"
model
:
multiVehicleManager
.
activeVehicle
?
multiVehicleManager
.
activeVehicle
.
trajectoryPoints
:
0
border.width
:
4
radius
:
4
delegate
:
border.color
:
{
MapPolyline
{
if
(
_mainIsMap
&&
_flightMap
!=
null
)
line.width
:
3
return
_flightMap
.
isSatelliteMap
?
Qt
.
rgba
(
1
,
1
,
1
,
0.75
)
:
Qt
.
rgba
(
0
,
0
,
0
,
0.75
)
line.color
:
"
orange
"
else
z
:
QGroundControl
.
zOrderMapItems
-
1
return
Qt
.
rgba
(
0
,
0
,
0
,
0.75
)
path
:
[
{
latitude
:
object
.
coordinate1
.
latitude
,
longitude
:
object
.
coordinate1
.
longitude
},
{
latitude
:
object
.
coordinate2
.
latitude
,
longitude
:
object
.
coordinate2
.
longitude
},
]
}
}
}
Loader
{
// Add the vehicles to the map
id
:
pipLoader
MapItemView
{
anchors.fill
:
parent
model
:
multiVehicleManager
.
vehicles
anchors.margins
:
2
onLoaded
:
{
delegate
:
if
(
_mainIsMap
)
{
VehicleMapItem
{
_flightVideo
=
item
vehicle
:
object
_flightVideo
.
visible
=
true
coordinate
:
object
.
coordinate
}
else
{
isSatellite
:
flightMap
.
isSatelliteMap
_flightMap
=
item
z
:
QGroundControl
.
zOrderMapItems
_savedZoomLevel
=
_flightMap
.
zoomLevel
_flightMap
.
zoomLevel
=
_savedZoomLevel
-
3
}
}
pip
.
visible
=
_controller
.
hasVideo
}
}
}
// Add the mission items to the map
MissionItemView
{
model
:
_missionController
.
missionItems
}
// Add lines between waypoints
MissionLineView
{
model
:
_missionController
.
waypointLines
}
// Used to make pinch zoom work
MouseArea
{
MouseArea
{
anchors.fill
:
parent
anchors.fill
:
parent
onClicked
:
{
_mainIsMap
=
!
_mainIsMap
pip
.
visible
=
false
reloadContents
();
}
}
}
}
// Flight Map
}
//-- Widgets
Loader
{
Loader
{
id
:
delay
Loader
id
:
widgets
Loader
anchors.fill
:
parent
anchors.fill
:
parent
}
}
}
}
src/FlightDisplay/FlightDisplayView
DelayLoad
.qml
→
src/FlightDisplay/FlightDisplayView
Widgets
.qml
View file @
b14e1a46
...
@@ -39,32 +39,8 @@ import QGroundControl.FlightMap 1.0
...
@@ -39,32 +39,8 @@ import QGroundControl.FlightMap 1.0
/// FlightDisplayViewControl.
/// FlightDisplayViewControl.
Item
{
Item
{
QGCVideoBackground
{
ExclusiveGroup
{
anchors.fill
:
parent
id
:
_dropButtonsExclusiveGroup
display
:
_controller
.
videoSurface
receiver
:
_controller
.
videoReceiver
visible
:
!
_showMap
QGCCompassHUD
{
id
:
compassHUD
y
:
root
.
height
*
0.7
x
:
root
.
width
*
0.5
-
ScreenTools
.
defaultFontPixelSize
*
(
5
)
width
:
ScreenTools
.
defaultFontPixelSize
*
(
10
)
height
:
ScreenTools
.
defaultFontPixelSize
*
(
10
)
heading
:
_heading
active
:
multiVehicleManager
.
activeVehicleAvailable
z
:
QGroundControl
.
zOrderWidgets
}
QGCAttitudeHUD
{
id
:
attitudeHUD
rollAngle
:
_roll
pitchAngle
:
_pitch
width
:
ScreenTools
.
defaultFontPixelSize
*
(
30
)
height
:
ScreenTools
.
defaultFontPixelSize
*
(
30
)
active
:
multiVehicleManager
.
activeVehicleAvailable
z
:
QGroundControl
.
zOrderWidgets
}
}
}
//-- Vehicle GPS lock display
//-- Vehicle GPS lock display
...
@@ -77,7 +53,7 @@ Item {
...
@@ -77,7 +53,7 @@ Item {
model
:
multiVehicleManager
.
vehicles
model
:
multiVehicleManager
.
vehicles
delegate
:
delegate
:
QGCLabel
{
QGCLabel
{
width
:
gpsLockColumn
.
width
width
:
gpsLockColumn
.
width
horizontalAlignment
:
Text
.
AlignHCenter
horizontalAlignment
:
Text
.
AlignHCenter
visible
:
!
object
.
coordinateValid
visible
:
!
object
.
coordinateValid
...
@@ -87,136 +63,140 @@ Item {
...
@@ -87,136 +63,140 @@ Item {
}
}
}
}
//-- Dismiss Drop Down (if any)
MouseArea
{
anchors.fill
:
parent
enabled
:
_dropButtonsExclusiveGroup
.
current
!=
null
onClicked
:
{
if
(
_dropButtonsExclusiveGroup
.
current
)
_dropButtonsExclusiveGroup
.
current
.
checked
=
false
_dropButtonsExclusiveGroup
.
current
=
null
}
}
//-- Instrument Pannel
//-- Instrument Pannel
QGCInstrumentWidget
{
QGCInstrumentWidget
{
anchors.margins
:
ScreenTools
.
defaultFontPixelHeight
anchors.margins
:
ScreenTools
.
defaultFontPixelHeight
anchors.left
:
parent
.
left
anchors.bottom
:
parent
.
bottom
anchors.bottom
:
parent
.
bottom
anchors.right
:
parent
.
right
size
:
ScreenTools
.
defaultFontPixelSize
*
(
9
)
size
:
ScreenTools
.
defaultFontPixelSize
*
(
9
)
active
:
_activeVehicle
!=
null
heading
:
_heading
heading
:
_heading
rollAngle
:
_roll
rollAngle
:
_roll
pitchAngle
:
_pitch
pitchAngle
:
_pitch
isSatellite
:
_mainIsMap
?
_flightMap
?
_flightMap
.
isSatelliteMap
:
true
:
true
z
:
QGroundControl
.
zOrderWidgets
z
:
QGroundControl
.
zOrderWidgets
}
}
//-- Map Center Control
//-- Vertical Tool Buttons
DropButton
{
Column
{
id
:
centerMapDropButton
id
:
toolColumn
anchors.rightMargin
:
ScreenTools
.
defaultFontPixelHeight
anchors.margins
:
ScreenTools
.
defaultFontPixelHeight
anchors.right
:
mapTypeButton
.
left
anchors.left
:
parent
.
left
anchors.top
:
mapTypeButton
.
top
anchors.top
:
parent
.
top
dropDirection
:
dropDown
spacing
:
ScreenTools
.
defaultFontPixelHeight
buttonImage
:
"
/qmlimages/MapCenter.svg
"
viewportMargins
:
ScreenTools
.
defaultFontPixelWidth
/
2
//-- Map Center Control
exclusiveGroup
:
_dropButtonsExclusiveGroup
DropButton
{
z
:
QGroundControl
.
zOrderWidgets
id
:
centerMapDropButton
dropDirection
:
dropRight
dropDownComponent
:
Component
{
buttonImage
:
"
/qmlimages/MapCenter.svg
"
Row
{
viewportMargins
:
ScreenTools
.
defaultFontPixelWidth
/
2
spacing
:
ScreenTools
.
defaultFontPixelWidth
exclusiveGroup
:
_dropButtonsExclusiveGroup
z
:
QGroundControl
.
zOrderWidgets
QGCCheckBox
{
id
:
followVehicleCheckBox
dropDownComponent
:
Component
{
text
:
"
Follow Vehicle
"
Row
{
checked
:
flightMap
.
_followVehicle
spacing
:
ScreenTools
.
defaultFontPixelWidth
anchors.baseline
:
centerMapButton
.
baseline
QGCCheckBox
{
onClicked
:
{
id
:
followVehicleCheckBox
centerMapDropButton
.
hideDropDown
()
text
:
"
Follow Vehicle
"
flightMap
.
_followVehicle
=
!
flightMap
.
_followVehicle
checked
:
_flightMap
?
_flightMap
.
_followVehicle
:
false
anchors.baseline
:
centerMapButton
.
baseline
onClicked
:
{
_dropButtonsExclusiveGroup
.
current
=
null
_flightMap
.
_followVehicle
=
!
_flightMap
.
_followVehicle
}
}
}
}
QGCButton
{
QGCButton
{
id
:
centerMapButton
id
:
centerMapButton
text
:
"
Center map on Vehicle
"
text
:
"
Center map on Vehicle
"
enabled
:
_activeVehicle
&&
!
followVehicleCheckBox
.
checked
enabled
:
_activeVehicle
&&
!
followVehicleCheckBox
.
checked
property
var
activeVehicle
:
multiVehicleManager
.
activeVehicle
property
var
activeVehicle
:
multiVehicleManager
.
activeVehicle
onClicked
:
{
onClicked
:
{
centerMapDropButton
.
hideDropDown
()
_dropButtonsExclusiveGroup
.
current
=
null
flightMap
.
latitude
=
activeVehicle
.
latitude
_flightMap
.
latitude
=
activeVehicle
.
latitude
flightMap
.
longitude
=
activeVehicle
.
longitude
_flightMap
.
longitude
=
activeVehicle
.
longitude
}
}
}
}
}
}
}
}
}
}
//-- Map Type Control
DropButton
{
id
:
mapTypeButton
anchors.topMargin
:
topMargin
anchors.rightMargin
:
ScreenTools
.
defaultFontPixelHeight
anchors.top
:
parent
.
top
anchors.right
:
parent
.
right
dropDirection
:
dropDown
buttonImage
:
"
/qmlimages/MapType.svg
"
viewportMargins
:
ScreenTools
.
defaultFontPixelWidth
/
2
exclusiveGroup
:
_dropButtonsExclusiveGroup
z
:
QGroundControl
.
zOrderWidgets
dropDownComponent
:
Component
{
Row
{
spacing
:
ScreenTools
.
defaultFontPixelWidth
Repeater
{
model
:
QGroundControl
.
flightMapSettings
.
mapTypes
QGCButton
{
checkable
:
true
checked
:
flightMap
.
mapType
==
text
text
:
modelData
onClicked
:
{
//-- Map Type Control
flightMap
.
mapType
=
text
DropButton
{
mapTypeButton
.
hideDropDown
()
id
:
mapTypeButton
dropDirection
:
dropRight
buttonImage
:
"
/qmlimages/MapType.svg
"
viewportMargins
:
ScreenTools
.
defaultFontPixelWidth
/
2
exclusiveGroup
:
_dropButtonsExclusiveGroup
z
:
QGroundControl
.
zOrderWidgets
dropDownComponent
:
Component
{
Row
{
spacing
:
ScreenTools
.
defaultFontPixelWidth
Repeater
{
model
:
QGroundControl
.
flightMapSettings
.
mapTypes
QGCButton
{
checkable
:
true
checked
:
_flightMap
?
_flightMap
.
mapType
==
text
:
false
text
:
modelData
onClicked
:
{
_flightMap
.
mapType
=
text
_dropButtonsExclusiveGroup
.
current
=
null
}
}
}
}
}
}
}
}
}
}
}
}
//-- Temporary Options Button
QGCButton
{
id
:
optionsButton
x
:
_flightMap
.
mapWidgets
.
x
y
:
_flightMap
.
mapWidgets
.
y
-
height
-
(
ScreenTools
.
defaultFontPixelHeight
/
2
)
z
:
QGroundControl
.
zOrderWidgets
width
:
_flightMap
.
mapWidgets
.
width
text
:
"
Options
"
menu
:
optionsMenu
visible
:
_controller
.
hasVideo
&&
!
hideWidgets
ExclusiveGroup
{
id
:
backgroundTypeGroup
}
Menu
{
id
:
optionsMenu
MenuItem
{
//-- Zoom Map In
id
:
mapBackgroundMenuItem
RoundButton
{
exclusiveGroup
:
backgroundTypeGroup
id
:
mapZoomPlus
checkable
:
true
visible
:
_mainIsMap
checked
:
_showMap
buttonImage
:
"
/qmlimages/ZoomPlus.svg
"
text
:
"
Show map as background
"
exclusiveGroup
:
_dropButtonsExclusiveGroup
z
:
QGroundControl
.
zOrderWidgets
onTriggered
:
_setShowMap
(
true
)
onClicked
:
{
if
(
_flightMap
)
_flightMap
.
zoomLevel
+=
0.5
checked
=
false
}
}
}
MenuItem
{
//-- Zoom Map Out
id
:
videoBackgroundMenuItem
RoundButton
{
exclusiveGroup
:
backgroundTypeGroup
id
:
mapZoomMinus
checkable
:
true
visible
:
_mainIsMap
checked
:
!
_showMap
buttonImage
:
"
/qmlimages/ZoomMinus.svg
"
text
:
"
Show video as background
"
exclusiveGroup
:
_dropButtonsExclusiveGroup
z
:
QGroundControl
.
zOrderWidgets
onTriggered
:
_setShowMap
(
false
)
onClicked
:
{
if
(
_flightMap
)
_flightMap
.
zoomLevel
-=
0.5
checked
=
false
}
}
}
}
}
}
}
}
src/FlightDisplay/qmldir
View file @
b14e1a46
Module QGroundControl.FlightDisplay
Module QGroundControl.FlightDisplay
FlightDisplayView 1.0 FlightDisplayView.qml
FlightDisplayView 1.0 FlightDisplayView.qml
FlightDisplayViewDelayLoad 1.0 FlightDisplayViewDelayLoad.qml
src/FlightMap/FlightMap.qml
View file @
b14e1a46
...
@@ -49,7 +49,7 @@ Map {
...
@@ -49,7 +49,7 @@ Map {
property
bool
interactive
:
true
property
bool
interactive
:
true
property
string
mapName
:
'
defaultMap
'
property
string
mapName
:
'
defaultMap
'
property
string
mapType
:
QGroundControl
.
flightMapSettings
.
mapTypeForMapName
(
mapName
)
property
string
mapType
:
QGroundControl
.
flightMapSettings
.
mapTypeForMapName
(
mapName
)
property
alias
mapWidgets
:
controlWidgets
//
property alias mapWidgets: controlWidgets
property
bool
isSatelliteMap
:
mapType
==
"
Satellite Map
"
||
mapType
==
"
Hybrid Map
"
property
bool
isSatelliteMap
:
mapType
==
"
Satellite Map
"
||
mapType
==
"
Hybrid Map
"
property
real
lon
:
(
longitude
>=
-
180
&&
longitude
<=
180
)
?
longitude
:
0
property
real
lon
:
(
longitude
>=
-
180
&&
longitude
<=
180
)
?
longitude
:
0
...
@@ -80,6 +80,7 @@ Map {
...
@@ -80,6 +80,7 @@ Map {
}
}
}
}
/*********************************************
/// Map control widgets
/// Map control widgets
Column {
Column {
id: controlWidgets
id: controlWidgets
...
@@ -151,6 +152,7 @@ Map {
...
@@ -151,6 +152,7 @@ Map {
}
}
} // Row - +/- buttons
} // Row - +/- buttons
} // Column - Map control widgets
} // Column - Map control widgets
*********************************************/
/*
/*
The slider and scale display are commented out for now to try to save real estate - DonLakeFlyer
The slider and scale display are commented out for now to try to save real estate - DonLakeFlyer
...
...
src/FlightMap/Images/ZoomMinus.svg
View file @
b14e1a46
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
version=
"1.1"
id=
"Layer_1"
xmlns=
"http://www.w3.org/2000/svg"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
x=
"0px"
y=
"0px"
<svg
version=
"1.1"
id=
"Layer_1"
xmlns=
"http://www.w3.org/2000/svg"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
x=
"0px"
y=
"0px"
viewBox=
"0 0 72 72"
enable-background=
"new 0 0 72 72"
xml:space=
"preserve"
>
viewBox=
"-269 361 72 72"
style=
"enable-background:new -269 361 72 72;"
xml:space=
"preserve"
>
<circle
fill=
"none"
stroke=
"#FFFFFF"
stroke-width=
"2"
stroke-miterlimit=
"10"
cx=
"29.573"
cy=
"30.04"
r=
"22.416"
/>
<style
type=
"text/css"
>
<line
fill=
"none"
stroke=
"#FFFFFF"
stroke-width=
"3"
stroke-miterlimit=
"10"
x1=
"64.8"
y1=
"64.83"
x2=
"45.801"
y2=
"45.765"
/>
.st0{fill:none;stroke:#FFFFFF;stroke-width:2;stroke-miterlimit:10;}
<line
fill=
"none"
x1=
"16.973"
y1=
"30.04"
x2=
"42.173"
y2=
"30.04"
/>
.st1{fill:none;stroke:#FFFFFF;stroke-width:3;stroke-miterlimit:10;}
<line
fill=
"none"
stroke=
"#FFFFFF"
stroke-width=
"5"
stroke-miterlimit=
"10"
x1=
"16.973"
y1=
"30.134"
x2=
"42.173"
y2=
"29.946"
/>
.st2{fill:none;}
.st3{fill:none;stroke:#FFFFFF;stroke-width:5;stroke-miterlimit:10;}
</style>
<circle
class=
"st0"
cx=
"-236.2"
cy=
"393.9"
r=
"11.2"
/>
<line
class=
"st1"
x1=
"-218.6"
y1=
"411.3"
x2=
"-228.1"
y2=
"401.8"
/>
<line
class=
"st2"
x1=
"-242.5"
y1=
"393.9"
x2=
"-229.9"
y2=
"393.9"
/>
<line
class=
"st3"
x1=
"-242.5"
y1=
"394"
x2=
"-229.9"
y2=
"393.9"
/>
</svg>
</svg>
src/FlightMap/Images/ZoomPlus.svg
View file @
b14e1a46
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
version=
"1.1"
id=
"Layer_1"
xmlns=
"http://www.w3.org/2000/svg"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
x=
"0px"
y=
"0px"
<svg
version=
"1.1"
id=
"Layer_1"
xmlns=
"http://www.w3.org/2000/svg"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
x=
"0px"
y=
"0px"
viewBox=
"0 0 72 72"
enable-background=
"new 0 0 72 72"
xml:space=
"preserve"
>
viewBox=
"-269 361 72 72"
style=
"enable-background:new -269 361 72 72;"
xml:space=
"preserve"
>
<circle
fill=
"none"
stroke=
"#FFFFFF"
stroke-width=
"2"
stroke-miterlimit=
"10"
cx=
"29.573"
cy=
"30.04"
r=
"22.416"
/>
<style
type=
"text/css"
>
<line
fill=
"none"
stroke=
"#FFFFFF"
stroke-width=
"3"
stroke-miterlimit=
"10"
x1=
"64.8"
y1=
"64.83"
x2=
"45.801"
y2=
"45.765"
/>
.st0{fill:none;stroke:#FFFFFF;stroke-width:2;stroke-miterlimit:10;}
<path
fill=
"#FFFFFF"
d=
"M27.36,42.653V32.187H16.973v-4.374H27.36V17.426h4.426v10.387h10.387v4.374H31.786v10.466H27.36z"
/>
.st1{fill:none;stroke:#FFFFFF;stroke-width:3;stroke-miterlimit:10;}
.st2{fill:#FFFFFF;}
</style>
<circle
class=
"st0"
cx=
"-236.2"
cy=
"393.9"
r=
"11.2"
/>
<line
class=
"st1"
x1=
"-218.6"
y1=
"411.3"
x2=
"-228.1"
y2=
"401.8"
/>
<path
class=
"st2"
d=
"M-237.3,400.2V395h-5.2v-2.2h5.2v-5.2h2.2v5.2h5.2v2.2h-5.2v5.2H-237.3z"
/>
</svg>
</svg>
src/FlightMap/MapItems/VehicleMapItem.qml
View file @
b14e1a46
...
@@ -33,8 +33,9 @@ import QGroundControl.Vehicle 1.0
...
@@ -33,8 +33,9 @@ import QGroundControl.Vehicle 1.0
/// Marker for displaying a vehicle location on the map
/// Marker for displaying a vehicle location on the map
MapQuickItem
{
MapQuickItem
{
property
var
vehicle
///< Vehicle object
property
var
vehicle
///< Vehicle object
property
bool
isSatellite
:
false
///< true: satellite map is showing
property
bool
isSatellite
:
false
///< true: satellite map is showing
property
real
size
:
ScreenTools
.
defaultFontPixelHeight
*
5
anchorPoint.x
:
vehicleIcon
.
width
/
2
anchorPoint.x
:
vehicleIcon
.
width
/
2
anchorPoint.y
:
vehicleIcon
.
height
/
2
anchorPoint.y
:
vehicleIcon
.
height
/
2
...
@@ -44,7 +45,7 @@ MapQuickItem {
...
@@ -44,7 +45,7 @@ MapQuickItem {
id
:
vehicleIcon
id
:
vehicleIcon
source
:
isSatellite
?
"
/qmlimages/airplaneOpaque.svg
"
:
"
/qmlimages/airplaneOutline.svg
"
source
:
isSatellite
?
"
/qmlimages/airplaneOpaque.svg
"
:
"
/qmlimages/airplaneOutline.svg
"
mipmap
:
true
mipmap
:
true
width
:
ScreenTools
.
defaultFontPixelHeight
*
5
width
:
size
fillMode
:
Image
.
PreserveAspectFit
fillMode
:
Image
.
PreserveAspectFit
transform
:
Rotation
{
transform
:
Rotation
{
...
...
src/FlightMap/Widgets/QGCInstrumentWidget.qml
View file @
b14e1a46
...
@@ -36,21 +36,26 @@ Item {
...
@@ -36,21 +36,26 @@ Item {
id
:
root
id
:
root
height
:
size
height
:
size
property
alias
heading
:
compass
.
heading
property
alias
heading
:
compass
.
heading
property
alias
active
:
attitude
.
active
property
alias
rollAngle
:
attitude
.
rollAngle
property
alias
rollAngle
:
attitude
.
rollAngle
property
alias
pitchAngle
:
attitude
.
pitchAngle
property
alias
pitchAngle
:
attitude
.
pitchAngle
property
real
size
:
ScreenTools
.
defaultFontPixelSize
*
(
10
)
property
real
size
:
ScreenTools
.
defaultFontPixelSize
*
(
10
)
property
bool
isSatellite
:
false
property
bool
active
:
false
property
bool
_isVisible
:
true
//-- Instrument Pannel
Rectangle
{
Rectangle
{
id
:
instrumentPannel
id
:
instrumentPannel
anchors.
left
:
parent
.
lef
t
anchors.
right
:
parent
.
righ
t
anchors.bottom
:
parent
.
bottom
anchors.bottom
:
parent
.
bottom
height
:
root
.
size
height
:
root
.
size
width
:
instruments
.
width
+
8
width
:
instruments
.
width
+
8
radius
:
root
.
size
/
2
radius
:
root
.
size
/
2
color
:
Qt
.
rgba
(
0
,
0
,
0
,
0.5
)
visible
:
_isVisible
color
:
isSatellite
?
Qt
.
rgba
(
1
,
1
,
1
,
0.5
)
:
Qt
.
rgba
(
0
,
0
,
0
,
0.5
)
Row
{
Row
{
id
:
instruments
id
:
instruments
height
:
parent
.
height
height
:
parent
.
height
...
@@ -59,14 +64,49 @@ Item {
...
@@ -59,14 +64,49 @@ Item {
QGCAttitudeWidget
{
QGCAttitudeWidget
{
id
:
attitude
id
:
attitude
size
:
parent
.
height
*
0.9
size
:
parent
.
height
*
0.9
active
:
root
.
active
anchors.verticalCenter
:
parent
.
verticalCenter
anchors.verticalCenter
:
parent
.
verticalCenter
}
}
QGCCompassWidget
{
QGCCompassWidget
{
id
:
compass
id
:
compass
size
:
parent
.
height
*
0.9
size
:
parent
.
height
*
0.9
active
:
root
.
active
anchors.verticalCenter
:
parent
.
verticalCenter
anchors.verticalCenter
:
parent
.
verticalCenter
}
}
}
}
MouseArea
{
anchors.fill
:
parent
onClicked
:
{
_isVisible
=
!
_isVisible
}
}
}
//-- Show Instruments
Rectangle
{
id
:
openButton
anchors.right
:
parent
.
right
anchors.bottom
:
parent
.
bottom
height
:
24
width
:
24
radius
:
4
visible
:
!
_isVisible
color
:
isSatellite
?
Qt
.
rgba
(
1
,
1
,
1
,
0.5
)
:
Qt
.
rgba
(
0
,
0
,
0
,
0.5
)
Image
{
width
:
parent
.
width
*
0.75
height
:
parent
.
height
*
0.75
source
:
"
/qmlimages/buttonLeft.svg
"
mipmap
:
true
fillMode
:
Image
.
PreserveAspectFit
anchors.verticalCenter
:
parent
.
verticalCenter
anchors.horizontalCenter
:
parent
.
horizontalCenter
}
MouseArea
{
anchors.fill
:
parent
onClicked
:
{
_isVisible
=
!
_isVisible
}
}
}
}
}
}
src/MissionEditor/MissionEditor.qml
View file @
b14e1a46
...
@@ -75,7 +75,11 @@ QGCView {
...
@@ -75,7 +75,11 @@ QGCView {
property
bool
_showHelp
:
QGroundControl
.
flightMapSettings
.
loadBoolMapSetting
(
editorMap
.
mapName
,
_showHelpKey
,
true
)
property
bool
_showHelp
:
QGroundControl
.
flightMapSettings
.
loadBoolMapSetting
(
editorMap
.
mapName
,
_showHelpKey
,
true
)
onGpsLockChanged
:
updateMapToVehiclePosition
()
onGpsLockChanged
:
updateMapToVehiclePosition
()
Component.onCompleted
:
updateMapToVehiclePosition
()
Component.onCompleted
:
{
helpPanel
.
source
=
"
MissionEditorHelp.qml
"
updateMapToVehiclePosition
()
}
function
updateMapToVehiclePosition
()
{
function
updateMapToVehiclePosition
()
{
if
(
gpsLock
&&
_firstGpsLock
)
{
if
(
gpsLock
&&
_firstGpsLock
)
{
...
@@ -676,207 +680,16 @@ QGCView {
...
@@ -676,207 +680,16 @@ QGCView {
} // Item - Home Position Manager
} // Item - Home Position Manager
*/
*/
// Help Panel
//-- Help Panel
Rectangle
{
Loader
{
id
:
helpPanel
id
:
helpPanel
anchors.margins
:
margins
width
:
parent
.
width
*
0.65
anchors.top
:
parent
.
top
height
:
parent
.
height
*
0.75
anchors.bottom
:
parent
.
bottom
z
:
QGroundControl
.
zOrderTopMost
anchors.left
:
addMissionItemsButton
.
right
anchors.verticalCenter
:
parent
.
verticalCenter
anchors.right
:
missionItemEditor
.
left
anchors.horizontalCenter
:
parent
.
horizontalCenter
width
:
parent
.
width
-
(
margins
*
2
)
-
_rightPanelWidth
}
visible
:
helpButton
.
checked
color
:
qgcPal
.
window
opacity
:
_rightPanelOpacity
radius
:
ScreenTools
.
defaultFontPixelHeight
z
:
QGroundControl
.
zOrderTopMost
readonly
property
real
margins
:
ScreenTools
.
defaultFontPixelHeight
Image
{
anchors.margins
:
ScreenTools
.
defaultFontPixelHeight
anchors.top
:
parent
.
top
anchors.right
:
parent
.
right
width
:
ScreenTools
.
defaultFontPixelHeight
*
1.5
height
:
ScreenTools
.
defaultFontPixelHeight
*
1.5
source
:
(
qgcPal
.
globalTheme
===
QGCPalette
.
Light
)
?
"
/qmlimages/XDeleteBlack.svg
"
:
"
/qmlimages/XDelete.svg
"
fillMode
:
Image
.
PreserveAspectFit
mipmap
:
true
smooth
:
true
MouseArea
{
anchors.fill
:
parent
onClicked
:
helpButton
.
checked
=
false
}
}
Item
{
anchors.margins
:
_margin
anchors.fill
:
parent
QGCLabel
{
id
:
helpTitle
font.pixelSize
:
ScreenTools
.
mediumFontPixelSize
text
:
"
Mission Planner
"
}
QGCLabel
{
id
:
helpIconLabel
anchors.topMargin
:
ScreenTools
.
defaultFontPixelHeight
anchors.top
:
helpTitle
.
bottom
width
:
parent
.
width
wrapMode
:
Text
.
WordWrap
text
:
"
Mission Planner tool buttons:
"
}
Image
{
id
:
addMissionItemsHelpIcon
anchors.topMargin
:
ScreenTools
.
defaultFontPixelHeight
anchors.top
:
helpIconLabel
.
bottom
width
:
ScreenTools
.
defaultFontPixelHeight
*
3
fillMode
:
Image
.
PreserveAspectFit
mipmap
:
true
smooth
:
true
source
:
(
qgcPal
.
globalTheme
===
QGCPalette
.
Light
)
?
"
/qmlimages/MapAddMissionBlack.svg
"
:
"
/qmlimages/MapAddMission.svg
"
}
QGCLabel
{
id
:
addMissionItemsHelpText
anchors.leftMargin
:
ScreenTools
.
defaultFontPixelHeight
anchors.left
:
mapTypeHelpIcon
.
right
anchors.right
:
parent
.
right
anchors.top
:
addMissionItemsHelpIcon
.
top
wrapMode
:
Text
.
WordWrap
text
:
"
<b>Add Mission Items</b><br>
"
+
"
When enabled, add mission items by clicking on the map.
"
}
Image
{
id
:
deleteHelpIcon
anchors.topMargin
:
ScreenTools
.
defaultFontPixelHeight
anchors.top
:
addMissionItemsHelpText
.
bottom
width
:
ScreenTools
.
defaultFontPixelHeight
*
3
fillMode
:
Image
.
PreserveAspectFit
mipmap
:
true
smooth
:
true
source
:
(
qgcPal
.
globalTheme
===
QGCPalette
.
Light
)
?
"
/qmlimages/TrashDeleteBlack.svg
"
:
"
/qmlimages/TrashDelete.svg
"
}
QGCLabel
{
id
:
deleteHelpText
anchors.leftMargin
:
ScreenTools
.
defaultFontPixelHeight
anchors.left
:
mapTypeHelpIcon
.
right
anchors.right
:
parent
.
right
anchors.top
:
deleteHelpIcon
.
top
wrapMode
:
Text
.
WordWrap
text
:
"
<b>Delete Mission Item</b><br>
"
+
"
Delete the currently selected mission item.
"
}
/*
Home Position Manager disabled
Image {
id: homePositionManagerHelpIcon
anchors.topMargin: ScreenTools.defaultFontPixelHeight
anchors.top: deleteHelpText.bottom
width: ScreenTools.defaultFontPixelHeight * 3
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
source: (qgcPal.globalTheme === QGCPalette.Light) ? "/qmlimages/MapHomeBlack.svg" : "/qmlimages/MapHome.svg"
}
QGCLabel {
id: homePositionManagerHelpText
anchors.leftMargin: ScreenTools.defaultFontPixelHeight
anchors.left: mapTypeHelpIcon.right
anchors.right: parent.right
anchors.top: homePositionManagerHelpIcon.top
wrapMode: Text.WordWrap
text: "<b>Flying Field Manager</b><br>" +
"When enabled, allows you to select/add/update flying field locations. " +
"You can save multiple flying field locations for use while creating missions while you are not connected to your vehicle."
}
*/
Image
{
id
:
mapCenterHelpIcon
anchors.topMargin
:
ScreenTools
.
defaultFontPixelHeight
anchors.top
:
deleteHelpText
.
bottom
width
:
ScreenTools
.
defaultFontPixelHeight
*
3
fillMode
:
Image
.
PreserveAspectFit
mipmap
:
true
smooth
:
true
source
:
(
qgcPal
.
globalTheme
===
QGCPalette
.
Light
)
?
"
/qmlimages/MapCenterBlack.svg
"
:
"
/qmlimages/MapCenter.svg
"
}
QGCLabel
{
id
:
mapCenterHelpText
anchors.leftMargin
:
ScreenTools
.
defaultFontPixelHeight
anchors.left
:
mapTypeHelpIcon
.
right
anchors.right
:
parent
.
right
anchors.top
:
mapCenterHelpIcon
.
top
wrapMode
:
Text
.
WordWrap
text
:
"
<b>Map Center</b><br>
"
+
"
Options for centering the map.
"
}
Image
{
id
:
syncHelpIcon
anchors.topMargin
:
ScreenTools
.
defaultFontPixelHeight
anchors.top
:
mapCenterHelpText
.
bottom
width
:
ScreenTools
.
defaultFontPixelHeight
*
3
fillMode
:
Image
.
PreserveAspectFit
mipmap
:
true
smooth
:
true
source
:
(
qgcPal
.
globalTheme
===
QGCPalette
.
Light
)
?
"
/qmlimages/MapSyncBlack.svg
"
:
"
/qmlimages/MapSync.svg
"
}
QGCLabel
{
id
:
syncHelpText
anchors.leftMargin
:
ScreenTools
.
defaultFontPixelHeight
anchors.left
:
mapTypeHelpIcon
.
right
anchors.right
:
parent
.
right
anchors.top
:
syncHelpIcon
.
top
wrapMode
:
Text
.
WordWrap
text
:
"
<b>Sync</b><br>
"
+
"
Options for saving/loading mission items.
"
}
Image
{
id
:
mapTypeHelpIcon
anchors.topMargin
:
ScreenTools
.
defaultFontPixelHeight
anchors.top
:
syncHelpText
.
bottom
width
:
ScreenTools
.
defaultFontPixelHeight
*
3
fillMode
:
Image
.
PreserveAspectFit
mipmap
:
true
smooth
:
true
source
:
(
qgcPal
.
globalTheme
===
QGCPalette
.
Light
)
?
"
/qmlimages/MapTypeBlack.svg
"
:
"
/qmlimages/MapType.svg
"
}
QGCLabel
{
id
:
mapTypeHelpText
anchors.leftMargin
:
ScreenTools
.
defaultFontPixelHeight
anchors.left
:
mapTypeHelpIcon
.
right
anchors.right
:
parent
.
right
anchors.top
:
mapTypeHelpIcon
.
top
wrapMode
:
Text
.
WordWrap
text
:
"
<b>Map Type</b><br>
"
+
"
Map type options.
"
}
QGCCheckBox
{
anchors.left
:
parent
.
left
anchors.bottom
:
parent
.
bottom
anchors.margins
:
_margin
checked
:
!
_showHelp
text
:
"
Don't show me again
"
onClicked
:
QGroundControl
.
flightMapSettings
.
saveBoolMapSetting
(
editorMap
.
mapName
,
_showHelpKey
,
!
checked
)
}
}
// Item - margin
}
// Item - Help Panel
RoundButton
{
RoundButton
{
id
:
addMissionItemsButton
id
:
addMissionItemsButton
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment