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
20f3f54c
Commit
20f3f54c
authored
Oct 26, 2015
by
Gus Grubba
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2118 from dogmaphobic/flightView
Flight View Work
parents
579206c6
4530e96d
Changes
21
Show whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
1010 additions
and
613 deletions
+1010
-613
qgroundcontrol.qrc
qgroundcontrol.qrc
+5
-2
FlightDisplayView.qml
src/FlightDisplay/FlightDisplayView.qml
+80
-118
FlightDisplayViewDelayLoadOuter.qml
src/FlightDisplay/FlightDisplayViewDelayLoadOuter.qml
+0
-145
FlightDisplayViewMap.qml
src/FlightDisplay/FlightDisplayViewMap.qml
+111
-0
FlightDisplayViewVideo.qml
src/FlightDisplay/FlightDisplayViewVideo.qml
+55
-0
FlightDisplayViewWidgets.qml
src/FlightDisplay/FlightDisplayViewWidgets.qml
+202
-0
qmldir
src/FlightDisplay/qmldir
+1
-3
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
attitudeInstrument.svg
src/FlightMap/Images/attitudeInstrument.svg
+7
-4
buttonLeft.svg
src/FlightMap/Images/buttonLeft.svg
+9
-15
buttonRight.svg
src/FlightMap/Images/buttonRight.svg
+9
-15
VehicleMapItem.qml
src/FlightMap/MapItems/VehicleMapItem.qml
+4
-3
QGCAttitudeWidget.qml
src/FlightMap/Widgets/QGCAttitudeWidget.qml
+78
-55
QGCCompassWidget.qml
src/FlightMap/Widgets/QGCCompassWidget.qml
+68
-39
QGCInstrumentWidget.qml
src/FlightMap/Widgets/QGCInstrumentWidget.qml
+112
-0
QGCPitchIndicator.qml
src/FlightMap/Widgets/QGCPitchIndicator.qml
+5
-2
qmldir
src/FlightMap/qmldir
+2
-1
MissionEditor.qml
src/MissionEditor/MissionEditor.qml
+14
-201
MissionEditorHelp.qml
src/MissionEditor/MissionEditorHelp.qml
+225
-0
No files found.
qgroundcontrol.qrc
View file @
20f3f54c
...
...
@@ -77,12 +77,14 @@
<file alias="FlightDisplayView.qml">src/FlightDisplay/FlightDisplayView.qml</file>
<file alias="FlightDisplayWidget.qml">src/FlightDisplay/FlightDisplayWidget.qml</file>
<file alias="MissionEditor.qml">src/MissionEditor/MissionEditor.qml</file>
<file alias="MissionEditorHelp.qml">src/MissionEditor/MissionEditorHelp.qml</file>
<!-- FlightDisplay module -->
<file alias="QGroundControl/FlightDisplay/qmldir">src/FlightDisplay/qmldir</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayView.qml">src/FlightDisplay/FlightDisplayView.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayViewDelayLoadInner.qml">src/FlightDisplay/FlightDisplayViewDelayLoadInner.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayViewDelayLoadOuter.qml">src/FlightDisplay/FlightDisplayViewDelayLoadOuter.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 -->
<file alias="QGroundControl/FlightMap/qmldir">src/FlightMap/qmldir</file>
...
...
@@ -96,6 +98,7 @@
<file alias="QGroundControl/FlightMap/QGCCompassHUD.qml">src/FlightMap/Widgets/QGCCompassHUD.qml</file>
<file alias="QGroundControl/FlightMap/QGCCurrentAltitude.qml">src/FlightMap/Widgets/QGCCurrentAltitude.qml</file>
<file alias="QGroundControl/FlightMap/QGCCurrentSpeed.qml">src/FlightMap/Widgets/QGCCurrentSpeed.qml</file>
<file alias="QGroundControl/FlightMap/QGCInstrumentWidget.qml">src/FlightMap/Widgets/QGCInstrumentWidget.qml</file>
<file alias="QGroundControl/FlightMap/QGCPitchIndicator.qml">src/FlightMap/Widgets/QGCPitchIndicator.qml</file>
<file alias="QGroundControl/FlightMap/QGCSlider.qml">src/FlightMap/Widgets/QGCSlider.qml</file>
<file alias="QGroundControl/FlightMap/QGCSpeedWidget.qml">src/FlightMap/Widgets/QGCSpeedWidget.qml</file>
...
...
src/FlightDisplay/FlightDisplayView.qml
View file @
20f3f54c
...
...
@@ -41,16 +41,6 @@ import QGroundControl.Controllers 1.0
Item
{
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
}
property
var
_activeVehicle
:
multiVehicleManager
.
activeVehicle
...
...
@@ -67,7 +57,7 @@ Item {
readonly
property
string
_mapName
:
"
FlightDisplayView
"
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
_pitch
:
_activeVehicle
?
(
isNaN
(
_activeVehicle
.
pitch
)
?
_defaultPitch
:
_activeVehicle
.
pitch
)
:
_defaultPitch
...
...
@@ -80,129 +70,101 @@ Item {
property
real
_airSpeed
:
_activeVehicle
?
_activeVehicle
.
airSpeed
:
_defaultAirSpeed
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
}
MissionController
{
id
:
_missionController
Component.onCompleted
:
start
(
false
/* editMode */
)
}
ExclusiveGroup
{
id
:
_dropButtonsExclusiveGroup
}
// Validate _showMap setting
Component.onCompleted
:
{
delayLoader
.
source
=
"
FlightDisplayViewDelayLoadOuter.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
reloadContents
()
{
if
(
_flightVideo
)
{
_flightVideo
.
visible
=
false
}
function
getBool
(
value
)
{
return
value
===
'
0
'
?
false
:
true
;
if
(
_mainIsMap
)
{
mainLoader
.
source
=
"
FlightDisplayViewMap.qml
"
pipLoader
.
source
=
"
FlightDisplayViewVideo.qml
"
}
else
{
mainLoader
.
source
=
"
FlightDisplayViewVideo.qml
"
pipLoader
.
source
=
"
FlightDisplayViewMap.qml
"
}
function
setBool
(
value
)
{
return
value
?
"
1
"
:
"
0
"
;
}
function
_setShowMap
(
showMap
)
{
_showMap
=
_controller
.
hasVideo
?
showMap
:
true
QGroundControl
.
flightMapSettings
.
saveMapSetting
(
flightMap
.
mapName
,
_showMapBackgroundKey
,
setBool
(
_showMap
))
Component.onCompleted
:
{
reloadContents
();
widgetsLoader
.
source
=
"
FlightDisplayViewWidgets.qml
"
}
FlightMap
{
id
:
flightMap
//-- Main Window
Loader
{
id
:
mainLoader
anchors.fill
:
parent
mapName
:
_mapName
visible
:
_showMap
latitude
:
root
.
_defaultCoordinate
.
latitude
longitude
:
root
.
_defaultCoordinate
.
longitude
property
var
rootVehicleCoordinate
:
_vehicleCoordinate
property
bool
rootLoadCompleted
:
false
property
bool
_followVehicle
:
true
onRootVehicleCoordinateChanged
:
updateMapPosition
(
false
/* force */
)
Component.onCompleted
:
flightMapDelayLoader
.
source
=
"
FlightDisplayViewDelayLoadInner.qml
"
function
updateMapPosition
(
force
)
{
if
((
_followVehicle
||
force
)
&&
rootLoadCompleted
)
{
flightMap
.
latitude
=
root
.
_vehicleCoordinate
.
latitude
flightMap
.
longitude
=
root
.
_vehicleCoordinate
.
longitude
}
onLoaded
:
{
if
(
_mainIsMap
)
{
_flightMap
=
item
if
(
_savedZoomLevel
!=
0
)
_flightMap
.
zoomLevel
=
_savedZoomLevel
else
_savedZoomLevel
=
_flightMap
.
zoomLevel
_flightMap
.
updateMapPosition
(
true
/* force */
)
}
else
{
_flightVideo
=
item
_flightVideo
.
visible
=
true
}
}
}
//-- PIP Window
Rectangle
{
id
:
pip
visible
:
_controller
.
hasVideo
anchors.margins
:
ScreenTools
.
defaultFontPixelHeight
anchors.left
:
parent
.
left
anchors.bottom
:
parent
.
bottom
height
:
ScreenTools
.
defaultFontPixelSize
*
(
9
)
width
:
ScreenTools
.
defaultFontPixelSize
*
(
9
)
*
(
16
/
9
)
color
:
"
#000010
"
border.width
:
4
radius
:
4
border.color
:
{
if
(
_mainIsMap
&&
_flightMap
!=
null
)
return
_flightMap
.
isSatelliteMap
?
Qt
.
rgba
(
1
,
1
,
1
,
0.75
)
:
Qt
.
rgba
(
0
,
0
,
0
,
0.75
)
else
return
Qt
.
rgba
(
0
,
0
,
0
,
0.75
)
}
// Home position
MissionItemIndicator
{
label
:
"
H
"
coordinate
:
(
_activeVehicle
&&
_activeVehicle
.
homePositionAvailable
)
?
_activeVehicle
.
homePosition
:
QtPositioning
.
coordinate
(
0
,
0
)
visible
:
_activeVehicle
?
_activeVehicle
.
homePositionAvailable
:
false
z
:
QGroundControl
.
zOrderMapItems
}
// Add trajectory points to the map
MapItemView
{
model
:
multiVehicleManager
.
activeVehicle
?
multiVehicleManager
.
activeVehicle
.
trajectoryPoints
:
0
delegate
:
MapPolyline
{
line.width
:
3
line.color
:
"
orange
"
z
:
QGroundControl
.
zOrderMapItems
-
1
path
:
[
{
latitude
:
object
.
coordinate1
.
latitude
,
longitude
:
object
.
coordinate1
.
longitude
},
{
latitude
:
object
.
coordinate2
.
latitude
,
longitude
:
object
.
coordinate2
.
longitude
},
]
}
}
// Add the vehicles to the map
MapItemView
{
model
:
multiVehicleManager
.
vehicles
delegate
:
VehicleMapItem
{
vehicle
:
object
coordinate
:
object
.
coordinate
isSatellite
:
flightMap
.
isSatelliteMap
z
:
QGroundControl
.
zOrderMapItems
}
}
// Add the mission items to the map
MissionItemView
{
model
:
_missionController
.
missionItems
}
// Add lines between waypoints
MissionLineView
{
model
:
_missionController
.
waypointLines
}
Loader
{
id
:
flightMapDelay
Loader
id
:
pip
Loader
anchors.fill
:
parent
anchors.margins
:
2
onLoaded
:
{
if
(
_mainIsMap
)
{
_flightVideo
=
item
_flightVideo
.
visible
=
true
}
else
{
_flightMap
=
item
_savedZoomLevel
=
_flightMap
.
zoomLevel
_flightMap
.
zoomLevel
=
_savedZoomLevel
-
3
}
pip
.
visible
=
_controller
.
hasVideo
}
}
// Used to make pinch zoom work
MouseArea
{
anchors.fill
:
parent
onClicked
:
{
_mainIsMap
=
!
_mainIsMap
pip
.
visible
=
false
reloadContents
();
}
}
}
}
// Flight Map
//-- Widgets
Loader
{
id
:
delay
Loader
id
:
widgets
Loader
anchors.fill
:
parent
}
}
src/FlightDisplay/FlightDisplayViewDelayLoadOuter.qml
deleted
100644 → 0
View file @
579206c6
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
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 <http://www.gnu.org/licenses/>.
======================================================================*/
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
QtPositioning
5.2
import
QGroundControl
1.0
import
QGroundControl
.
ScreenTools
1.0
import
QGroundControl
.
Controls
1.0
import
QGroundControl
.
Palette
1.0
import
QGroundControl
.
Vehicle
1.0
import
QGroundControl
.
FlightMap
1.0
/// This component is used to delay load the items which are direct children of the
/// FlightDisplayViewControl.
Item
{
QGCVideoBackground
{
anchors.fill
:
parent
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
}
}
QGCAltitudeWidget
{
anchors.right
:
parent
.
right
height
:
parent
.
height
*
0.65
>
ScreenTools
.
defaultFontPixelSize
*
(
23.4
)
?
ScreenTools
.
defaultFontPixelSize
*
(
23.4
)
:
parent
.
height
*
0.65
width
:
ScreenTools
.
defaultFontPixelSize
*
(
5
)
altitude
:
_altitudeWGS84
z
:
QGroundControl
.
zOrderWidgets
visible
:
!
hideWidgets
}
QGCSpeedWidget
{
anchors.left
:
parent
.
left
width
:
ScreenTools
.
defaultFontPixelSize
*
(
5
)
height
:
parent
.
height
*
0.65
>
ScreenTools
.
defaultFontPixelSize
*
(
23.4
)
?
ScreenTools
.
defaultFontPixelSize
*
(
23.4
)
:
parent
.
height
*
0.65
speed
:
_groundSpeed
z
:
QGroundControl
.
zOrderWidgets
visible
:
!
hideWidgets
}
QGCCurrentSpeed
{
anchors.left
:
parent
.
left
width
:
ScreenTools
.
defaultFontPixelSize
*
(
6.25
)
airspeed
:
_airSpeed
groundspeed
:
_groundSpeed
active
:
multiVehicleManager
.
activeVehicleAvailable
z
:
QGroundControl
.
zOrderWidgets
visible
:
!
hideWidgets
}
QGCCurrentAltitude
{
anchors.right
:
parent
.
right
width
:
ScreenTools
.
defaultFontPixelSize
*
(
6.25
)
altitude
:
_altitudeWGS84
vertZ
:
_climbRate
active
:
multiVehicleManager
.
activeVehicleAvailable
z
:
QGroundControl
.
zOrderWidgets
visible
:
!
hideWidgets
}
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
{
id
:
mapBackgroundMenuItem
exclusiveGroup
:
backgroundTypeGroup
checkable
:
true
checked
:
_showMap
text
:
"
Show map as background
"
onTriggered
:
_setShowMap
(
true
)
}
MenuItem
{
id
:
videoBackgroundMenuItem
exclusiveGroup
:
backgroundTypeGroup
checkable
:
true
checked
:
!
_showMap
text
:
"
Show video as background
"
onTriggered
:
_setShowMap
(
false
)
}
}
}
}
src/FlightDisplay/FlightDisplayViewMap.qml
0 → 100644
View file @
20f3f54c
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
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 <http://www.gnu.org/licenses/>.
======================================================================*/
import
QtQuick
2.4
import
QtQuick
.
Controls
1.3
import
QtLocation
5.3
import
QtPositioning
5.2
import
QGroundControl
1.0
import
QGroundControl
.
FlightDisplay
1.0
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
import
QGroundControl
.
Controllers
1.0
FlightMap
{
id
:
flightMap
anchors.fill
:
parent
mapName
:
_mapName
latitude
:
root
.
_defaultCoordinate
.
latitude
longitude
:
root
.
_defaultCoordinate
.
longitude
property
var
rootVehicleCoordinate
:
_vehicleCoordinate
property
bool
_followVehicle
:
true
onRootVehicleCoordinateChanged
:
updateMapPosition
(
false
/* force */
)
function
updateMapPosition
(
force
)
{
if
(
_followVehicle
||
force
)
{
flightMap
.
latitude
=
root
.
_vehicleCoordinate
.
latitude
flightMap
.
longitude
=
root
.
_vehicleCoordinate
.
longitude
}
}
// Home position
MissionItemIndicator
{
label
:
"
H
"
coordinate
:
(
_activeVehicle
&&
_activeVehicle
.
homePositionAvailable
)
?
_activeVehicle
.
homePosition
:
QtPositioning
.
coordinate
(
0
,
0
)
visible
:
{
if
(
!
_mainIsMap
)
return
false
;
return
_activeVehicle
?
_activeVehicle
.
homePositionAvailable
:
false
}
z
:
QGroundControl
.
zOrderMapItems
}
// Add trajectory points to the map
MapItemView
{
model
:
_mainIsMap
?
multiVehicleManager
.
activeVehicle
?
multiVehicleManager
.
activeVehicle
.
trajectoryPoints
:
0
:
0
delegate
:
MapPolyline
{
line.width
:
3
line.color
:
"
orange
"
z
:
QGroundControl
.
zOrderMapItems
-
1
path
:
[
{
latitude
:
object
.
coordinate1
.
latitude
,
longitude
:
object
.
coordinate1
.
longitude
},
{
latitude
:
object
.
coordinate2
.
latitude
,
longitude
:
object
.
coordinate2
.
longitude
},
]
}
}
// Add the vehicles to the map
MapItemView
{
model
:
multiVehicleManager
.
vehicles
delegate
:
VehicleMapItem
{
vehicle
:
object
coordinate
:
object
.
coordinate
isSatellite
:
flightMap
.
isSatelliteMap
size
:
_mainIsMap
?
ScreenTools
.
defaultFontPixelHeight
*
5
:
ScreenTools
.
defaultFontPixelHeight
*
2
z
:
QGroundControl
.
zOrderMapItems
}
}
// Add the mission items to the map
MissionItemView
{
model
:
_mainIsMap
?
_missionController
.
missionItems
:
0
}
// Add lines between waypoints
MissionLineView
{
model
:
_mainIsMap
?
_missionController
.
waypointLines
:
0
}
// Used to make pinch zoom work
MouseArea
{
anchors.fill
:
parent
}
}
src/FlightDisplay/FlightDisplayViewVideo.qml
0 → 100644
View file @
20f3f54c
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
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 <http://www.gnu.org/licenses/>.
======================================================================*/
import
QtQuick
2.4
import
QtQuick
.
Controls
1.3
import
QGroundControl
1.0
import
QGroundControl
.
FlightDisplay
1.0
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
import
QGroundControl
.
Controllers
1.0
QGCVideoBackground
{
anchors.fill
:
parent
display
:
_controller
.
videoSurface
receiver
:
_controller
.
videoReceiver
/* TODO: Come up with a way to make this an option
QGCAttitudeHUD {
id: attitudeHUD
visible: !_mainIsMap
rollAngle: _roll
pitchAngle: _pitch
width: ScreenTools.defaultFontPixelSize * (30)
height: ScreenTools.defaultFontPixelSize * (30)
active: multiVehicleManager.activeVehicleAvailable
z: QGroundControl.zOrderWidgets
}
*/
}
src/FlightDisplay/FlightDisplayView
DelayLoadInner
.qml
→
src/FlightDisplay/FlightDisplayView
Widgets
.qml
View file @
20f3f54c
...
...
@@ -35,10 +35,15 @@ import QGroundControl.Palette 1.0
import
QGroundControl
.
Vehicle
1.0
import
QGroundControl
.
FlightMap
1.0
/// This component is used to delay load the controls which are children of the inner FlightMap
/// control of FlightDisplayView.
// Vehicle GPS lock display
/// This component is used to delay load the items which are direct children of the
/// FlightDisplayViewControl.
Item
{
ExclusiveGroup
{
id
:
_dropButtonsExclusiveGroup
}
//-- Vehicle GPS lock display
Column
{
id
:
gpsLockColumn
y
:
(
parent
.
height
-
height
)
/
2
...
...
@@ -58,33 +63,43 @@ Item {
}
}
QGCCompassWidget
{
anchors.leftMargin
:
ScreenTools
.
defaultFontPixelHeight
anchors.topMargin
:
topMargin
anchors.left
:
parent
.
left
anchors.top
:
parent
.
top
size
:
ScreenTools
.
defaultFontPixelSize
*
(
13.3
)
heading
:
_heading
z
:
QGroundControl
.
zOrderWidgets
//-- Dismiss Drop Down (if any)
MouseArea
{
anchors.fill
:
parent
enabled
:
_dropButtonsExclusiveGroup
.
current
!=
null
onClicked
:
{
if
(
_dropButtonsExclusiveGroup
.
current
)
_dropButtonsExclusiveGroup
.
current
.
checked
=
false
_dropButtonsExclusiveGroup
.
current
=
null
}
}
QGCAttitudeWidget
{
//-- Instrument Pannel
QGCInstrumentWidget
{
anchors.margins
:
ScreenTools
.
defaultFontPixelHeight
anchors.left
:
parent
.
left
anchors.bottom
:
parent
.
bottom
size
:
ScreenTools
.
defaultFontPixelSize
*
(
13.3
)
anchors.right
:
parent
.
right
size
:
ScreenTools
.
defaultFontPixelSize
*
(
9
)
active
:
_activeVehicle
!=
null
heading
:
_heading
rollAngle
:
_roll
pitchAngle
:
_pitch
active
:
multiVehicleManager
.
activeVehicleAvailabl
e
isSatellite
:
_mainIsMap
?
_flightMap
?
_flightMap
.
isSatelliteMap
:
true
:
tru
e
z
:
QGroundControl
.
zOrderWidgets
}
//-- Vertical Tool Buttons
Column
{
id
:
toolColumn
anchors.margins
:
ScreenTools
.
defaultFontPixelHeight
anchors.left
:
parent
.
left
anchors.top
:
parent
.
top
spacing
:
ScreenTools
.
defaultFontPixelHeight
//-- Map Center Control
DropButton
{
id
:
centerMapDropButton
anchors.rightMargin
:
ScreenTools
.
defaultFontPixelHeight
anchors.right
:
mapTypeButton
.
left
anchors.top
:
mapTypeButton
.
top
dropDirection
:
dropDown
dropDirection
:
dropRight
buttonImage
:
"
/qmlimages/MapCenter.svg
"
viewportMargins
:
ScreenTools
.
defaultFontPixelWidth
/
2
exclusiveGroup
:
_dropButtonsExclusiveGroup
...
...
@@ -97,12 +112,12 @@ Item {
QGCCheckBox
{
id
:
followVehicleCheckBox
text
:
"
Follow Vehicle
"
checked
:
flightMap
.
_followVehicl
e
checked
:
_flightMap
?
_flightMap
.
_followVehicle
:
fals
e
anchors.baseline
:
centerMapButton
.
baseline
onClicked
:
{
centerMapDropButton
.
hideDropDown
()
flightMap
.
_followVehicle
=
!
flightMap
.
_followVehicle
_dropButtonsExclusiveGroup
.
current
=
null
_flightMap
.
_followVehicle
=
!
_
flightMap
.
_followVehicle
}
}
...
...
@@ -114,22 +129,19 @@ Item {
property
var
activeVehicle
:
multiVehicleManager
.
activeVehicle
onClicked
:
{
centerMapDropButton
.
hideDropDown
()
flightMap
.
latitude
=
activeVehicle
.
latitude
flightMap
.
longitude
=
activeVehicle
.
longitude
_dropButtonsExclusiveGroup
.
current
=
null
_flightMap
.
latitude
=
activeVehicle
.
latitude
_
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
dropDirection
:
dropRight
buttonImage
:
"
/qmlimages/MapType.svg
"
viewportMargins
:
ScreenTools
.
defaultFontPixelWidth
/
2
exclusiveGroup
:
_dropButtonsExclusiveGroup
...
...
@@ -144,16 +156,47 @@ Item {
QGCButton
{
checkable
:
true
checked
:
flightMap
.
mapType
==
text
checked
:
_flightMap
?
_flightMap
.
mapType
==
text
:
false
text
:
modelData
onClicked
:
{
flightMap
.
mapType
=
text
mapTypeButton
.
hideDropDown
()
_
flightMap
.
mapType
=
text
_dropButtonsExclusiveGroup
.
current
=
null
}
}
}
}
}
}
//-- Zoom Map In
RoundButton
{
id
:
mapZoomPlus
visible
:
_mainIsMap
buttonImage
:
"
/qmlimages/ZoomPlus.svg
"
exclusiveGroup
:
_dropButtonsExclusiveGroup
z
:
QGroundControl
.
zOrderWidgets
onClicked
:
{
if
(
_flightMap
)
_flightMap
.
zoomLevel
+=
0.5
checked
=
false
}
}
//-- Zoom Map Out
RoundButton
{
id
:
mapZoomMinus
visible
:
_mainIsMap
buttonImage
:
"
/qmlimages/ZoomMinus.svg
"
exclusiveGroup
:
_dropButtonsExclusiveGroup
z
:
QGroundControl
.
zOrderWidgets
onClicked
:
{
if
(
_flightMap
)
_flightMap
.
zoomLevel
-=
0.5
checked
=
false
}
}
}
}
src/FlightDisplay/qmldir
View file @
20f3f54c
Module QGroundControl.FlightDisplay
FlightDisplayView 1.0 FlightDisplayView.qml
FlightDisplayViewDelayLoadInner 1.0 FlightDisplayViewDelayLoadInner.qml
FlightDisplayViewDelayLoadOuter 1.0 FlightDisplayViewDelayLoadOuter.qml
src/FlightMap/FlightMap.qml
View file @
20f3f54c
...
...
@@ -49,7 +49,7 @@ Map {
property
bool
interactive
:
true
property
string
mapName
:
'
defaultMap
'
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
real
lon
:
(
longitude
>=
-
180
&&
longitude
<=
180
)
?
longitude
:
0
...
...
@@ -80,6 +80,7 @@ Map {
}
}
/*********************************************
/// Map control widgets
Column {
id: controlWidgets
...
...
@@ -151,6 +152,7 @@ Map {
}
} // Row - +/- buttons
} // Column - Map control widgets
*********************************************/
/*
The slider and scale display are commented out for now to try to save real estate - DonLakeFlyer
...
...
src/FlightMap/Images/ZoomMinus.svg
View file @
20f3f54c
<?xml version="1.0" encoding="utf-8"?>
<!-- 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"
viewBox=
"0 0 72 72"
enable-background=
"new 0 0 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"
/>
<line
fill=
"none"
stroke=
"#FFFFFF"
stroke-width=
"3"
stroke-miterlimit=
"10"
x1=
"64.8"
y1=
"64.83"
x2=
"45.801"
y2=
"45.765"
/>
<line
fill=
"none"
x1=
"16.973"
y1=
"30.04"
x2=
"42.173"
y2=
"30.04"
/>
<line
fill=
"none"
stroke=
"#FFFFFF"
stroke-width=
"5"
stroke-miterlimit=
"10"
x1=
"16.973"
y1=
"30.134"
x2=
"42.173"
y2=
"29.946"
/>
viewBox=
"-269 361 72 72"
style=
"enable-background:new -269 361 72 72;"
xml:space=
"preserve"
>
<style
type=
"text/css"
>
.st0{fill:none;stroke:#FFFFFF;stroke-width:2;stroke-miterlimit:10;}
.st1{fill:none;stroke:#FFFFFF;stroke-width:3;stroke-miterlimit:10;}
.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>
src/FlightMap/Images/ZoomPlus.svg
View file @
20f3f54c
<?xml version="1.0" encoding="utf-8"?>
<!-- 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"
viewBox=
"0 0 72 72"
enable-background=
"new 0 0 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"
/>
<line
fill=
"none"
stroke=
"#FFFFFF"
stroke-width=
"3"
stroke-miterlimit=
"10"
x1=
"64.8"
y1=
"64.83"
x2=
"45.801"
y2=
"45.765"
/>
<path
fill=
"#FFFFFF"
d=
"M27.36,42.653V32.187H16.973v-4.374H27.36V17.426h4.426v10.387h10.387v4.374H31.786v10.466H27.36z"
/>
viewBox=
"-269 361 72 72"
style=
"enable-background:new -269 361 72 72;"
xml:space=
"preserve"
>
<style
type=
"text/css"
>
.st0{fill:none;stroke:#FFFFFF;stroke-width:2;stroke-miterlimit:10;}
.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>
src/FlightMap/Images/attitudeInstrument.svg
View file @
20f3f54c
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 1
8.1.1
, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!-- Generator: Adobe Illustrator 1
9.1.0
, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
version=
"1.1"
id=
"Layer_4"
xmlns=
"http://www.w3.org/2000/svg"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
x=
"0px"
y=
"0px"
viewBox=
"0 0 288 288"
enable-background=
"new 0 0 288 288"
xml:space=
"preserve"
>
<path
fill=
"#333333"
d=
"M0-0.002v288h288v-288H0z M144,270c-69.588,0-126-56.412-126-126S74.412,18,144,18s126,56.412,126,126
S213.588,270,144,270z"
/>
viewBox=
"-161 253 288 288"
style=
"enable-background:new -161 253 288 288;"
xml:space=
"preserve"
>
<style
type=
"text/css"
>
.st0{fill:#202020;}
</style>
<path
class=
"st0"
d=
"M-161,253v288h288V253L-161,253L-161,253z M-17,523c-69.6,0-126-56.4-126-126s56.4-126,126-126
s126,56.4,126,126S52.6,523-17,523z"
/>
</svg>
src/FlightMap/Images/buttonLeft.svg
View file @
20f3f54c
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 1
8.1.1
, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
x=
"0px"
y=
"0px"
viewBox=
"
0 0 288 288"
enable-background=
"new 0 0 288 288
"
xml:space=
"preserve"
>
<
g
id=
"Layer_1
"
>
<rect
fill=
"#58595B"
width=
"288"
height=
"288"
/>
</
g
>
<!-- Generator: Adobe Illustrator 1
9.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"
viewBox=
"
-161 253 288 288"
style=
"enable-background:new -161 253 288 288;
"
xml:space=
"preserve"
>
<
style
type=
"text/css
"
>
.st0{fill:none;stroke:#231F20;stroke-width:24;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
</
style
>
<g
id=
"Layer_2"
>
<polyline
fill=
"none"
stroke=
"#A7A9AC"
stroke-width=
"24"
stroke-linecap=
"round"
stroke-linejoin=
"round"
stroke-miterlimit=
"10"
points=
"
110.541,54 58.58,144 110.541,234 "
/>
<polyline
fill=
"none"
stroke=
"#A7A9AC"
stroke-width=
"24"
stroke-linecap=
"round"
stroke-linejoin=
"round"
stroke-miterlimit=
"10"
points=
"
169.981,54 118.019,144 169.981,234 "
/>
<polyline
fill=
"none"
stroke=
"#A7A9AC"
stroke-width=
"24"
stroke-linecap=
"round"
stroke-linejoin=
"round"
stroke-miterlimit=
"10"
points=
"
229.42,54 177.459,144 229.42,234 "
/>
<polyline
class=
"st0"
points=
"-59.8,282 -126.1,397 -59.8,512 "
/>
<polyline
class=
"st0"
points=
"16.2,282 -50.2,397 16.2,512 "
/>
<polyline
class=
"st0"
points=
"92.1,282 25.8,397 92.1,512 "
/>
</g>
</svg>
src/FlightMap/Images/buttonRight.svg
View file @
20f3f54c
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 1
8.1.1
, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
x=
"0px"
y=
"0px"
viewBox=
"
0 0 288 288"
enable-background=
"new 0 0 288 288
"
xml:space=
"preserve"
>
<
g
id=
"Layer_1
"
>
<rect
fill=
"#58595B"
width=
"288"
height=
"288"
/>
</
g
>
<!-- Generator: Adobe Illustrator 1
9.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"
viewBox=
"
-161 253 288 288"
style=
"enable-background:new -161 253 288 288;
"
xml:space=
"preserve"
>
<
style
type=
"text/css
"
>
.st0{fill:none;stroke:#231F20;stroke-width:24;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
</
style
>
<g
id=
"Layer_2"
>
<polyline
fill=
"none"
stroke=
"#A7A9AC"
stroke-width=
"24"
stroke-linecap=
"round"
stroke-linejoin=
"round"
stroke-miterlimit=
"10"
points=
"
177.459,234 229.42,144 177.459,54 "
/>
<polyline
fill=
"none"
stroke=
"#A7A9AC"
stroke-width=
"24"
stroke-linecap=
"round"
stroke-linejoin=
"round"
stroke-miterlimit=
"10"
points=
"
118.019,234 169.981,144 118.019,54 "
/>
<polyline
fill=
"none"
stroke=
"#A7A9AC"
stroke-width=
"24"
stroke-linecap=
"round"
stroke-linejoin=
"round"
stroke-miterlimit=
"10"
points=
"
58.58,234 110.541,144 58.58,54 "
/>
<polyline
class=
"st0"
points=
"15.8,512 82.1,397 15.8,282 "
/>
<polyline
class=
"st0"
points=
"-60.2,512 6.2,397 -60.2,282 "
/>
<polyline
class=
"st0"
points=
"-136.1,512 -69.8,397 -136.1,282 "
/>
</g>
</svg>
src/FlightMap/MapItems/VehicleMapItem.qml
View file @
20f3f54c
...
...
@@ -35,6 +35,7 @@ import QGroundControl.Vehicle 1.0
MapQuickItem
{
property
var
vehicle
///< Vehicle object
property
bool
isSatellite
:
false
///< true: satellite map is showing
property
real
size
:
ScreenTools
.
defaultFontPixelHeight
*
5
anchorPoint.x
:
vehicleIcon
.
width
/
2
anchorPoint.y
:
vehicleIcon
.
height
/
2
...
...
@@ -44,7 +45,7 @@ MapQuickItem {
id
:
vehicleIcon
source
:
isSatellite
?
"
/qmlimages/airplaneOpaque.svg
"
:
"
/qmlimages/airplaneOutline.svg
"
mipmap
:
true
width
:
ScreenTools
.
defaultFontPixelHeight
*
5
width
:
size
fillMode
:
Image
.
PreserveAspectFit
transform
:
Rotation
{
...
...
src/FlightMap/Widgets/QGCAttitudeWidget.qml
View file @
20f3f54c
...
...
@@ -28,9 +28,11 @@ This file is part of the QGROUNDCONTROL project
*/
import
QtQuick
2.4
import
QtGraphicalEffects
1.0
import
QGroundControl
.
Controls
1.0
QGCMovable
Item
{
Item
{
id
:
root
property
bool
active
:
false
///< true: actively connected to data provider, false: show inactive control
...
...
@@ -48,6 +50,11 @@ QGCMovableItem {
width
:
size
height
:
size
Item
{
id
:
instrument
anchors.fill
:
parent
visible
:
false
//----------------------------------------------------
//-- Artificial Horizon
QGCArtificialHorizon
{
...
...
@@ -99,13 +106,29 @@ QGCMovableItem {
width
:
size
*
0.75
fillMode
:
Image
.
PreserveAspectFit
}
//----------------------------------------------------
//-- Instrument Pannel
Image
{
id
:
pannel
source
:
"
/qmlimages/attitudeInstrument.svg
"
mipmap
:
true
fillMode
:
Image
.
PreserveAspectFit
}
Rectangle
{
id
:
mask
anchors.fill
:
instrument
radius
:
width
/
2
color
:
"
black
"
visible
:
false
}
OpacityMask
{
anchors.fill
:
instrument
source
:
instrument
maskSource
:
mask
}
Rectangle
{
id
:
borderRect
anchors.fill
:
parent
radius
:
width
/
2
color
:
Qt
.
rgba
(
0
,
0
,
0
,
0
)
border.color
:
"
black
"
border.width
:
2
}
}
src/FlightMap/Widgets/QGCCompassWidget.qml
View file @
20f3f54c
...
...
@@ -28,25 +28,37 @@ This file is part of the QGROUNDCONTROL project
*/
import
QtQuick
2.4
import
QtGraphicalEffects
1.0
import
QGroundControl
.
Controls
1.0
import
QGroundControl
.
ScreenTools
1.0
QGCMovable
Item
{
Item
{
id
:
root
property
real
heading
:
_defaultHeading
property
bool
active
:
false
///< true: actively connected to data provider, false: show inactive control
property
real
heading
:
0
property
real
size
:
ScreenTools
.
defaultFontPixelSize
*
(
10
)
property
int
_fontSize
:
ScreenTools
.
defaultFontPixelSize
readonly
property
real
_defaultHeading
:
0
property
int
_fontSize
:
ScreenTools
.
defaultFontPixelSize
*
0.8
width
:
size
height
:
size
Rectangle
{
id
:
compassBack
id
:
borderRect
anchors.fill
:
parent
color
:
"
#212121
"
radius
:
width
/
2
color
:
"
#202020
"
border.color
:
"
black
"
border.width
:
2
}
Item
{
id
:
instrument
anchors.fill
:
parent
visible
:
false
Image
{
id
:
pointer
source
:
"
/qmlimages/compassInstrumentAirplane.svg
"
...
...
@@ -60,6 +72,7 @@ QGCMovableItem {
angle
:
heading
}
}
Image
{
id
:
compassDial
source
:
"
/qmlimages/compassInstrumentDial.svg
"
...
...
@@ -67,20 +80,36 @@ QGCMovableItem {
fillMode
:
Image
.
PreserveAspectFit
anchors.fill
:
parent
}
Rectangle
{
anchors.centerIn
:
roo
t
anchors.centerIn
:
paren
t
width
:
size
*
0.35
height
:
size
*
0.2
border.color
:
Qt
.
rgba
(
1
,
1
,
1
,
0.15
)
color
:
Qt
.
rgba
(
0
,
0
,
0
,
0.65
)
QGCLabel
{
text
:
_heading
.
toFixed
(
0
)
font.weight
:
Font
.
DemiBold
text
:
active
?
heading
.
toFixed
(
0
)
:
"
OFF
"
font.weight
:
active
?
Font
.
DemiBold
:
Font
.
Light
font.pixelSize
:
_fontSize
<
1
?
1
:
_fontSize
;
color
:
"
white
"
anchors.centerIn
:
parent
visible
:
active
}
}
}
Rectangle
{
id
:
mask
anchors.fill
:
instrument
radius
:
width
/
2
color
:
"
black
"
visible
:
false
}
OpacityMask
{
anchors.fill
:
instrument
source
:
instrument
maskSource
:
mask
}
}
src/FlightMap/Widgets/QGCInstrumentWidget.qml
0 → 100644
View file @
20f3f54c
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
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 <http://www.gnu.org/licenses/>.
======================================================================*/
/**
* @file
* @brief QGC Compass Widget
* @author Gus Grubba <mavlink@grubba.com>
*/
import
QtQuick
2.4
import
QGroundControl
.
Controls
1.0
import
QGroundControl
.
ScreenTools
1.0
Item
{
id
:
root
height
:
size
property
alias
heading
:
compass
.
heading
property
alias
rollAngle
:
attitude
.
rollAngle
property
alias
pitchAngle
:
attitude
.
pitchAngle
property
real
size
:
ScreenTools
.
defaultFontPixelSize
*
(
10
)
property
bool
isSatellite
:
false
property
bool
active
:
false
property
bool
_isVisible
:
true
//-- Instrument Pannel
Rectangle
{
id
:
instrumentPannel
anchors.right
:
parent
.
right
anchors.bottom
:
parent
.
bottom
height
:
root
.
size
width
:
instruments
.
width
+
ScreenTools
.
defaultFontPixelSize
radius
:
root
.
size
/
2
visible
:
_isVisible
color
:
isSatellite
?
Qt
.
rgba
(
1
,
1
,
1
,
0.5
)
:
Qt
.
rgba
(
0
,
0
,
0
,
0.5
)
Row
{
id
:
instruments
height
:
parent
.
height
spacing
:
ScreenTools
.
defaultFontPixelSize
/
2
anchors.horizontalCenter
:
parent
.
horizontalCenter
QGCAttitudeWidget
{
id
:
attitude
size
:
parent
.
height
*
0.9
active
:
root
.
active
anchors.verticalCenter
:
parent
.
verticalCenter
}
QGCCompassWidget
{
id
:
compass
size
:
parent
.
height
*
0.9
active
:
root
.
active
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
:
ScreenTools
.
defaultFontPixelSize
*
2
width
:
ScreenTools
.
defaultFontPixelSize
*
2
radius
:
ScreenTools
.
defaultFontPixelSize
/
3
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/FlightMap/Widgets/QGCPitchIndicator.qml
View file @
20f3f54c
...
...
@@ -34,13 +34,16 @@ import QGroundControl.Controls 1.0
Rectangle
{
property
real
pitchAngle
:
0
property
real
rollAngle
:
0
property
real
size
:
120
property
real
size
:
_defaultSize
property
real
_reticleHeight
:
1
property
real
_reticleSpacing
:
size
*
0.15
property
real
_reticleSlot
:
_reticleSpacing
+
_reticleHeight
property
real
_longDash
:
size
*
0.40
property
real
_shortDash
:
size
*
0.25
property
real
_fontSize
:
ScreenTools
.
defaultFontPixelSize
property
real
_fontSize
:
ScreenTools
.
defaultFontPixelSize
*
(
size
/
_defaultSize
)
property
real
_defaultSize
:
ScreenTools
.
isAndroid
?
300
:
100
height
:
size
*
0.9
width
:
size
radius
:
ScreenTools
.
defaultFontPixelSize
*
(
0.66
)
...
...
src/FlightMap/qmldir
View file @
20f3f54c
...
...
@@ -13,12 +13,13 @@ QGCCompassHUD 1.0 QGCCompassHUD.qml
QGCCompassWidget 1.0 QGCCompassWidget.qml
QGCCurrentAltitude 1.0 QGCCurrentAltitude.qml
QGCCurrentSpeed 1.0 QGCCurrentSpeed.qml
QGCInstrumentWidget 1.0 QGCInstrumentWidget.qml
QGCPitchIndicator 1.0 QGCPitchIndicator.qml
QGCSlider 1.0 QGCSlider.qml
QGCSpeedWidget 1.0 QGCSpeedWidget.qml
# Map items
VehicleMapItem 1.0 VehicleMapItem.qml
MissionItemIndicator 1.0 MissionItemIndicator.qml
MissionItemView 1.0 MissionItemView.qml
MissionLineView 1.0 MissionLineView.qml
VehicleMapItem 1.0 VehicleMapItem.qml
src/MissionEditor/MissionEditor.qml
View file @
20f3f54c
...
...
@@ -75,7 +75,11 @@ QGCView {
property
bool
_showHelp
:
QGroundControl
.
flightMapSettings
.
loadBoolMapSetting
(
editorMap
.
mapName
,
_showHelpKey
,
true
)
onGpsLockChanged
:
updateMapToVehiclePosition
()
Component.onCompleted
:
updateMapToVehiclePosition
()
Component.onCompleted
:
{
helpPanel
.
source
=
"
MissionEditorHelp.qml
"
updateMapToVehiclePosition
()
}
function
updateMapToVehiclePosition
()
{
if
(
gpsLock
&&
_firstGpsLock
)
{
...
...
@@ -676,207 +680,16 @@ QGCView {
} // Item - Home Position Manager
*/
// Help Panel
Rectangle
{
//
--
Help Panel
Loader
{
id
:
helpPanel
anchors.margins
:
margins
anchors.top
:
parent
.
top
anchors.bottom
:
parent
.
bottom
anchors.left
:
addMissionItemsButton
.
right
anchors.right
:
missionItemEditor
.
left
width
:
parent
.
width
-
(
margins
*
2
)
-
_rightPanelWidth
visible
:
helpButton
.
checked
color
:
qgcPal
.
window
opacity
:
_rightPanelOpacity
radius
:
ScreenTools
.
defaultFontPixelHeight
width
:
parent
.
width
*
0.65
height
:
parent
.
height
*
0.75
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.
"
anchors.verticalCenter
:
parent
.
verticalCenter
anchors.horizontalCenter
:
parent
.
horizontalCenter
}
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
{
id
:
addMissionItemsButton
...
...
src/MissionEditor/MissionEditorHelp.qml
0 → 100644
View file @
20f3f54c
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
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 <http://www.gnu.org/licenses/>.
======================================================================*/
import
QtQuick
2.4
import
QtQuick
.
Controls
1.3
import
QtQuick
.
Dialogs
1.2
import
QGroundControl
1.0
import
QGroundControl
.
ScreenTools
1.0
import
QGroundControl
.
Controls
1.0
import
QGroundControl
.
Palette
1.0
Rectangle
{
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
)
}
}
}
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