Commit c6b66c46 authored by Gus Grubba's avatar Gus Grubba

Merge pull request #2179 from mavlink/toolbarWork

Toolbar work
parents a120ffe7 1a960233
...@@ -65,7 +65,7 @@ cache: ...@@ -65,7 +65,7 @@ cache:
before_install: before_install:
- cd ${TRAVIS_BUILD_DIR} && git fetch --unshallow && git fetch --tags - cd ${TRAVIS_BUILD_DIR} && git fetch --unshallow && git fetch --all --tags
- if [ "${TRAVIS_OS_NAME}" = "linux" ]; then mkdir -p ~/.config/QtProject/ && cp ${TRAVIS_BUILD_DIR}/test/qtlogging.ini ~/.config/QtProject/; fi - if [ "${TRAVIS_OS_NAME}" = "linux" ]; then mkdir -p ~/.config/QtProject/ && cp ${TRAVIS_BUILD_DIR}/test/qtlogging.ini ~/.config/QtProject/; fi
- if [ "${TRAVIS_OS_NAME}" = "osx" ]; then mkdir -p ~/Library/Preferences/QtProject/ && cp ${TRAVIS_BUILD_DIR}/test/qtlogging.ini ~/Library/Preferences/QtProject/; fi - if [ "${TRAVIS_OS_NAME}" = "osx" ]; then mkdir -p ~/Library/Preferences/QtProject/ && cp ${TRAVIS_BUILD_DIR}/test/qtlogging.ini ~/Library/Preferences/QtProject/; fi
- if [ "${TRAVIS_OS_NAME}" = "android" ]; then wget https://s3-us-west-2.amazonaws.com/qgroundcontrol/dependencies/gstreamer-1.0-android-armv7-1.5.2.tar.bz2 && mkdir -p ${TRAVIS_BUILD_DIR}/gstreamer-1.0-android-armv7-1.5.2 && tar jxf gstreamer-1.0-android-armv7-1.5.2.tar.bz2 -C ${TRAVIS_BUILD_DIR}/gstreamer-1.0-android-armv7-1.5.2; fi - if [ "${TRAVIS_OS_NAME}" = "android" ]; then wget https://s3-us-west-2.amazonaws.com/qgroundcontrol/dependencies/gstreamer-1.0-android-armv7-1.5.2.tar.bz2 && mkdir -p ${TRAVIS_BUILD_DIR}/gstreamer-1.0-android-armv7-1.5.2 && tar jxf gstreamer-1.0-android-armv7-1.5.2.tar.bz2 -C ${TRAVIS_BUILD_DIR}/gstreamer-1.0-android-armv7-1.5.2; fi
...@@ -81,6 +81,7 @@ install: ...@@ -81,6 +81,7 @@ install:
&& sh -e /etc/init.d/xvfb start && sh -e /etc/init.d/xvfb start
; ;
elif [ "${TRAVIS_OS_NAME}" = "osx" ]; then elif [ "${TRAVIS_OS_NAME}" = "osx" ]; then
brew update;
brew update brew update
&& brew install qt5 && brew install qt5
&& export PATH=/usr/local/opt/qt5/bin:$PATH && export PATH=/usr/local/opt/qt5/bin:$PATH
......
...@@ -80,6 +80,25 @@ ...@@ -80,6 +80,25 @@
<file alias="XDelete.svg">src/FlightMap/Images/XDelete.svg</file> <file alias="XDelete.svg">src/FlightMap/Images/XDelete.svg</file>
<file alias="XDeleteBlack.svg">src/FlightMap/Images/XDeleteBlack.svg</file> <file alias="XDeleteBlack.svg">src/FlightMap/Images/XDeleteBlack.svg</file>
<!-- Toolbar -->
<file alias="Armed.svg">src/ui/toolbar/Images/Armed.svg</file>
<file alias="Battery.svg">src/ui/toolbar/Images/Battery.svg</file>
<file alias="Connect.svg">src/ui/toolbar/Images/Connect.svg</file>
<file alias="Disarmed.svg">src/ui/toolbar/Images/Disarmed.svg</file>
<file alias="Disconnect.svg">src/ui/toolbar/Images/Disconnect.svg</file>
<file alias="Gps.svg">src/ui/toolbar/Images/Gps.svg</file>
<file alias="Megaphone.svg">src/ui/toolbar/Images/Megaphone.svg</file>
<file alias="Quad.svg">src/ui/toolbar/Images/Quad.svg</file>
<file alias="RC.svg">src/ui/toolbar/Images/RC.svg</file>
<file alias="Signal0.svg">src/ui/toolbar/Images/Signal0.svg</file>
<file alias="Signal20.svg">src/ui/toolbar/Images/Signal20.svg</file>
<file alias="Signal40.svg">src/ui/toolbar/Images/Signal40.svg</file>
<file alias="Signal60.svg">src/ui/toolbar/Images/Signal60.svg</file>
<file alias="Signal80.svg">src/ui/toolbar/Images/Signal80.svg</file>
<file alias="Signal100.svg">src/ui/toolbar/Images/Signal100.svg</file>
<file alias="Yield.svg">src/ui/toolbar/Images/Yield.svg</file>
</qresource> </qresource>
<qresource prefix="/res"> <qresource prefix="/res">
...@@ -100,9 +119,6 @@ ...@@ -100,9 +119,6 @@
<file alias="Shutdown">resources/Shutdown.svg</file> <file alias="Shutdown">resources/Shutdown.svg</file>
<file alias="AntennaT">resources/Antenna_T.svg</file> <file alias="AntennaT">resources/Antenna_T.svg</file>
<file alias="AntennaRC">resources/Antenna_RC.svg</file> <file alias="AntennaRC">resources/Antenna_RC.svg</file>
<file alias="Gps">resources/Gps.svg</file>
<file alias="Megaphone">resources/Megaphone.png</file>
<file alias="Yield">resources/Yield.png</file>
<file alias="Battery_0">resources/Battery_0.svg</file> <file alias="Battery_0">resources/Battery_0.svg</file>
<file alias="Battery_20">resources/Battery_20.svg</file> <file alias="Battery_20">resources/Battery_20.svg</file>
<file alias="Battery_40">resources/Battery_40.svg</file> <file alias="Battery_40">resources/Battery_40.svg</file>
...@@ -112,6 +128,10 @@ ...@@ -112,6 +128,10 @@
<file alias="SystemLockScreen">resources/SystemLockScreen.svg</file> <file alias="SystemLockScreen">resources/SystemLockScreen.svg</file>
<file alias="SplashScreen">resources/SplashScreen.png</file> <file alias="SplashScreen">resources/SplashScreen.png</file>
<file alias="QGroundControlConnect">resources/QGroundControlConnect.svg</file> <file alias="QGroundControlConnect">resources/QGroundControlConnect.svg</file>
<file alias="Gears">resources/Gears.svg</file>
<file alias="Plan">resources/Plan.svg</file>
<file alias="PaperPlane">resources/PaperPlane.svg</file>
<file alias="PowerButton">resources/PowerButton.svg</file>
</qresource> </qresource>
<qresource prefix="/res/firmware"> <qresource prefix="/res/firmware">
......
...@@ -51,8 +51,11 @@ ...@@ -51,8 +51,11 @@
<!-- Main Window --> <!-- Main Window -->
<file alias="MainWindow.qml">src/ui/MainWindow.qml</file> <file alias="MainWindow.qml">src/ui/MainWindow.qml</file>
<!-- Main ToolBar -->
<file alias="QGroundControl/Controls/MainToolBar.qml">src/ui/toolbar/MainToolBar.qml</file> <file alias="QGroundControl/Controls/MainToolBar.qml">src/ui/toolbar/MainToolBar.qml</file>
<file alias="MainToolBarActiveVehicleComponent.qml">src/ui/toolbar/MainToolBarActiveVehicleComponent.qml</file> <file alias="QGroundControl/Controls/MainToolBarIndicators.qml">src/ui/toolbar/MainToolBarIndicators.qml</file>
<file alias="QGroundControl/Controls/SignalStrength.qml">src/ui/toolbar/SignalStrength.qml</file>
<!-- Vehicle Setup --> <!-- Vehicle Setup -->
<file alias="SetupView.qml">src/VehicleSetup/SetupView.qml</file> <file alias="SetupView.qml">src/VehicleSetup/SetupView.qml</file>
......
<?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="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="160 862 72 72" style="enable-background:new 160 862 72 72;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<g>
<path class="st0" d="M164.7,888.4c0.4,1.3,0.9,2.5,1.6,3.7l-1.9,2.4c-0.6,0.8-0.5,1.9,0.1,2.6l3.3,3.3c0.7,0.7,1.8,0.8,2.6,0.1
l2.4-1.9c1.2,0.7,2.5,1.3,3.9,1.6l0.4,3.1c0.1,1,1,1.7,1.9,1.7h4.6c1,0,1.8-0.7,1.9-1.7l0.3-2.9c1.5-0.4,2.8-0.9,4.1-1.7l2.3,1.8
c0.8,0.6,1.9,0.5,2.6-0.1l3.3-3.3c0.7-0.7,0.8-1.8,0.1-2.6l-1.8-2.3c0.7-1.3,1.3-2.6,1.7-4.1l2.7-0.3c1-0.1,1.7-1,1.7-1.9v-4.6
c0-1-0.7-1.8-1.7-1.9l-2.7-0.3c-0.4-1.4-0.9-2.8-1.6-4l1.7-2.1c0.6-0.8,0.5-1.9-0.1-2.6l-3.3-3.3c-0.7-0.7-1.8-0.8-2.6-0.1l-2,1.6
c-1.3-0.8-2.7-1.4-4.2-1.8l-0.3-2.6c-0.1-1-1-1.7-1.9-1.7h-4.6c-1,0-1.8,0.7-1.9,1.7l-0.3,2.6c-1.5,0.4-3,1-4.3,1.8l-2.1-1.7
c-0.8-0.6-1.9-0.5-2.6,0.1l-3.3,3.3c-0.7,0.7-0.8,1.8-0.1,2.6l1.8,2.2c-0.7,1.3-1.3,2.6-1.6,4.1l-2.8,0.3c-1,0.1-1.7,1-1.7,1.9v4.6
c0,1,0.7,1.8,1.7,1.9L164.7,888.4z M181.4,875.9c4.2,0,7.6,3.4,7.6,7.6s-3.4,7.6-7.6,7.6c-4.2,0-7.6-3.4-7.6-7.6
S177.2,875.9,181.4,875.9z"/>
<path class="st0" d="M227,889.5l-2.4-2.1c-0.7-0.6-1.9-0.6-2.6,0.1l-1.3,1.3c-1.1-0.5-2.3-0.9-3.6-1.2l-0.4-1.9
c-0.2-1-1.1-1.6-2.1-1.5l-3.2,0.3c-1,0.1-1.7,0.9-1.8,1.9l-0.1,1.9c-1.2,0.4-2.4,1-3.4,1.8l-1.6-1.1c-0.8-0.5-1.9-0.4-2.5,0.4
l-2.1,2.4c-0.6,0.7-0.6,1.9,0.1,2.6l1.4,1.5c-0.5,1.1-0.8,2.2-1,3.4l-2,0.4c-1,0.2-1.6,1.1-1.5,2.1l0.3,3.2c0.1,1,0.9,1.7,1.9,1.8
l2.2,0.1c0.4,1,0.9,2,1.5,2.9l-1.2,1.8c-0.5,0.8-0.4,1.9,0.4,2.5l2.4,2.1c0.7,0.6,1.9,0.6,2.6-0.1l1.6-1.5c1,0.5,2.1,0.8,3.3,1.1
l0.4,2.2c0.2,1,1.1,1.6,2.1,1.5l3.2-0.3c1-0.1,1.7-0.9,1.8-1.9l0.1-2.1c1.2-0.4,2.3-1,3.3-1.7l1.8,1.2c0.8,0.5,1.9,0.4,2.5-0.4
l2.1-2.4c0.6-0.7,0.6-1.9-0.1-2.6l-1.4-1.5c0.5-1.1,0.9-2.3,1.1-3.4l1.9-0.4c1-0.2,1.6-1.1,1.5-2.1l-0.3-3.2
c-0.1-1-0.9-1.7-1.9-1.8l-1.9-0.1c-0.4-1.1-0.9-2.2-1.6-3.2l1.1-1.6C227.9,891.2,227.8,890.1,227,889.5z M215.1,907.9
c-3.4,0.3-6.5-2.3-6.7-5.7c-0.3-3.4,2.3-6.5,5.7-6.7c3.4-0.3,6.5,2.3,6.7,5.7C221,904.6,218.5,907.6,215.1,907.9z"/>
<path class="st0" d="M175.8,916.4c-1,0.1-1.7,0.9-1.7,1.9l0,2c0,1,0.7,1.8,1.7,1.9l1.4,0.2c0.2,0.9,0.6,1.7,1,2.5l-0.9,1.1
c-0.6,0.8-0.6,1.9,0.1,2.6l1.4,1.4c0.7,0.7,1.8,0.8,2.6,0.2l1.2-0.9c0.8,0.5,1.7,0.9,2.6,1.1l0.2,1.5c0.1,1,0.9,1.7,1.9,1.7l2,0
c1,0,1.8-0.7,1.9-1.7l0.2-1.4c1-0.2,1.9-0.6,2.8-1.1l1.1,0.9c0.8,0.6,1.9,0.6,2.6-0.1l1.4-1.4c0.7-0.7,0.8-1.8,0.2-2.6l-0.8-1.1
c0.5-0.8,0.9-1.8,1.2-2.7l1.3-0.1c1-0.1,1.7-0.9,1.7-1.9l0-2c0-1-0.7-1.8-1.7-1.9l-1.3-0.2c-0.2-0.9-0.6-1.9-1.1-2.7l0.8-1
c0.6-0.8,0.6-1.9-0.1-2.6l-1.4-1.4c-0.7-0.7-1.8-0.8-2.6-0.2l-0.9,0.7c-0.9-0.5-1.8-0.9-2.8-1.2l-0.1-1.2c-0.1-1-0.9-1.7-1.9-1.7
l-2,0c-1,0-1.8,0.7-1.9,1.7l-0.2,1.2c-1,0.3-2,0.7-2.9,1.2l-1-0.8c-0.8-0.6-1.9-0.6-2.6,0.1l-1.4,1.4c-0.7,0.7-0.8,1.8-0.2,2.6
l0.8,1.1c-0.5,0.8-0.9,1.8-1.1,2.7L175.8,916.4z M188.4,914.2c2.8,0,5.1,2.3,5,5.1c0,2.8-2.3,5.1-5.1,5c-2.8,0-5.1-2.3-5-5.1
C183.3,916.4,185.6,914.2,188.4,914.2z"/>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
x="0px"
y="0px"
width="110px"
height="110px"
viewBox="0 0 110 110"
enable-background="new 0 0 110 110"
xml:space="preserve"
id="svg3852"
inkscape:version="0.91 r13725"
sodipodi:docname="gps.svg"><title
id="title4758">GPS</title><metadata
id="metadata3933"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title>GPS</dc:title><dc:creator><cc:Agent><dc:title>Gus Grubba</dc:title></cc:Agent></dc:creator><cc:license
rdf:resource="http://creativecommons.org/licenses/by-nc/3.0/" /></cc:Work><cc:License
rdf:about="http://creativecommons.org/licenses/by-nc/3.0/"><cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" /><cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" /><cc:prohibits
rdf:resource="http://creativecommons.org/ns#CommercialUse" /><cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /></cc:License></rdf:RDF></metadata><defs
id="defs3931" /><sodipodi:namedview
pagecolor="#808080"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview3929"
showgrid="false"
inkscape:zoom="11.136364"
inkscape:cx="55"
inkscape:cy="55"
inkscape:current-layer="svg3852" /><g
id="Layer_2"
display="none" /><g
id="ex_thick"
style="fill:#ffffff;stroke:#ffffff;stroke-opacity:1"
transform="matrix(-1,0,0,-1,111.82126,108.29692)" /><g
id="Layer_2_copy_3"
display="none" /><g
id="ex_thin"
style="fill:#ffffff;stroke:#ffffff;stroke-opacity:1"
transform="matrix(-1,0,0,-1,111.82126,108.29692)" /><g
id="Layer_2_copy"
display="none" /><g
id="em_thick"
style="fill:#ffffff;stroke:#ffffff;stroke-opacity:1"
transform="matrix(-1,0,0,-1,111.82126,108.29692)" /><g
id="Layer_2_copy_4"
display="none"><g
display="inline"
id="g3861"><rect
x="-36.1"
y="-21.3"
fill="none"
stroke="#EB008B"
stroke-width="0.25"
stroke-linecap="round"
stroke-linejoin="round"
stroke-miterlimit="10"
width="56.3"
height="56.3"
id="rect3863" /><circle
fill="none"
stroke="#EB008B"
stroke-width="0.25"
stroke-linecap="round"
stroke-linejoin="round"
stroke-miterlimit="10"
cx="-8"
cy="6.8"
r="28.2"
id="circle3865" /></g><g
display="inline"
id="g3867"><rect
x="28.3"
y="-21.3"
fill="none"
stroke="#EB008B"
stroke-width="0.25"
stroke-linecap="round"
stroke-linejoin="round"
stroke-miterlimit="10"
width="56.3"
height="56.3"
id="rect3869" /><circle
fill="none"
stroke="#EB008B"
stroke-width="0.25"
stroke-linecap="round"
stroke-linejoin="round"
stroke-miterlimit="10"
cx="56.5"
cy="6.8"
r="28.2"
id="circle3871" /></g><g
display="inline"
id="g3873"><rect
x="91.5"
y="-21.3"
fill="none"
stroke="#EB008B"
stroke-width="0.25"
stroke-linecap="round"
stroke-linejoin="round"
stroke-miterlimit="10"
width="56.3"
height="56.3"
id="rect3875" /><circle
fill="none"
stroke="#EB008B"
stroke-width="0.25"
stroke-linecap="round"
stroke-linejoin="round"
stroke-miterlimit="10"
cx="119.7"
cy="6.8"
r="28.2"
id="circle3877" /></g></g><rect
x="-129.87416"
y="-13.196043"
transform="matrix(-0.70710678,-0.70710678,0.70710678,-0.70710678,0,0)"
stroke-miterlimit="10"
width="32.29969"
height="16.099846"
id="rect3882"
style="fill:#ffffff;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" /><rect
x="24.979502"
y="-2.9382656"
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
stroke-miterlimit="10"
width="32.29969"
height="16.099846"
id="rect3884"
style="fill:#ffffff;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" /><path
stroke-miterlimit="10"
d="m 31.121258,78.396923 c 4.7,4.7 12.4,4.7 17.1,0 l 22.8,-22.9 -17.1,-17.1 -22.8,22.8 c -4.7,4.8 -4.7,12.4 0,17.2 z"
id="path3886"
style="fill:#ffffff;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1"
inkscape:connector-curvature="0" /><path
stroke-miterlimit="10"
d="m 62.521258,46.996923 c 6.3,6.3 16.5,6.3 22.8,0 l -22.8,-22.8 c -6.3,6.2 -6.3,16.5 0,22.8 z"
id="path3888"
style="fill:#ffffff;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1"
inkscape:connector-curvature="0" /><path
stroke-miterlimit="10"
d="m 96.084265,44.511467 c 8.249995,-8.25 8.249995,-21.75 0,-30 -8.25,-8.2499943 -21.75,-8.2499943 -30,0"
id="path3890"
style="fill:none;stroke:#ffffff;stroke-width:3.89999986;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" /><path
stroke-miterlimit="10"
d="m 86.118561,36.977171 c 3.6,-3.6 3.6,-9.3 0,-12.9 -3.6,-3.6 -9.3,-3.6 -12.9,0"
id="path3892"
style="fill:none;stroke:#ffffff;stroke-width:3.89999986;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" /><line
stroke-miterlimit="10"
x1="65.321259"
y1="72.596924"
x2="59.621258"
y2="66.896919"
id="line3894"
style="fill:#ffffff;stroke:#ffffff;stroke-width:4.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" /><line
stroke-miterlimit="10"
x1="42.521255"
y1="49.796921"
x2="36.821259"
y2="44.096924"
id="line3896"
style="fill:#ffffff;stroke:#ffffff;stroke-width:4.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" /><g
id="Layer_2_copy_2"
display="none"><g
display="inline"
id="g3905"><rect
x="-36.1"
y="83.3"
fill="none"
stroke="#EB008B"
stroke-width="0.25"
stroke-linecap="round"
stroke-linejoin="round"
stroke-miterlimit="10"
width="56.3"
height="56.3"
id="rect3907" /><circle
fill="none"
stroke="#EB008B"
stroke-width="0.25"
stroke-linecap="round"
stroke-linejoin="round"
stroke-miterlimit="10"
cx="-8"
cy="111.5"
r="28.2"
id="circle3909" /></g><g
display="inline"
id="g3911"><rect
x="28.3"
y="83.3"
fill="none"
stroke="#EB008B"
stroke-width="0.25"
stroke-linecap="round"
stroke-linejoin="round"
stroke-miterlimit="10"
width="56.3"
height="56.3"
id="rect3913" /><circle
fill="none"
stroke="#EB008B"
stroke-width="0.25"
stroke-linecap="round"
stroke-linejoin="round"
stroke-miterlimit="10"
cx="56.5"
cy="111.5"
r="28.2"
id="circle3915" /></g><g
display="inline"
id="g3917"><rect
x="91.5"
y="83.3"
fill="none"
stroke="#EB008B"
stroke-width="0.25"
stroke-linecap="round"
stroke-linejoin="round"
stroke-miterlimit="10"
width="56.3"
height="56.3"
id="rect3919" /><circle
fill="none"
stroke="#EB008B"
stroke-width="0.25"
stroke-linecap="round"
stroke-linejoin="round"
stroke-miterlimit="10"
cx="119.7"
cy="111.5"
r="28.2"
id="circle3921" /></g></g><g
id="hornet"
style="fill:#ffffff;stroke:#ffffff;stroke-opacity:1"
transform="matrix(-1,0,0,-1,111.82126,108.29692)" /><g
id="Layer_2_copy_5"
display="none" /><g
id="hornet_THIN"
style="fill:#ffffff;stroke:#ffffff;stroke-opacity:1"
transform="matrix(-1,0,0,-1,111.82126,108.29692)" /><g
id="Layer_6"
display="none"><polygon
display="inline"
fill="none"
stroke="#224A80"
stroke-width="3"
stroke-linecap="round"
stroke-linejoin="round"
stroke-miterlimit="10"
points=" -14.6,111.2 -19.5,111.2 -19.5,152.2 3.4,152.2 3.4,111.2 -1.5,111.2 -1.5,104.7 -14.6,104.7 "
id="polygon3927" /></g></svg>
\ No newline at end of file
<?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="194 896 72 72" style="enable-background:new 194 896 72 72;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<path class="st0" d="M194,943.5c-0.1-0.9,0.2-1.6,1-2l67.5-45c0.4-0.3,0.8-0.4,1.3-0.4s0.9,0.1,1.3,0.4c0.7,0.5,1.1,1.2,1,2.2
l-11.2,67.5c-0.2,0.7-0.6,1.2-1.1,1.5c-0.4,0.2-0.7,0.3-1.1,0.3c-0.3,0-0.6,0-0.8-0.1l-21.8-8.7l-4.6,7.7c-0.5,0.7-1.1,1.1-2,1.1
s-1.5-0.4-2-1.1l-8.3-14.5l-17.6-7C194.6,945,194.1,944.3,194,943.5L194,943.5z M201,942.7l13.6,5.5c0.1,0.1,0.2,0.2,0.4,0.3
l0.2,0.1l38-40.6L201,942.7z M216.9,950.1l6.3,11l36.3-56.6L216.9,950.1z M230.1,954.6c0.6,0.1,1,0.2,1.4,0.3l19.1,7.7l9-53.8
L230.1,954.6z"/>
</svg>
<?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="road-icon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-255 447 72 72" style="enable-background:new -255 447 72 72;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
.st1{fill:#FFFFFF;stroke:#FFFFFF;stroke-width:9;stroke-linecap:round;stroke-miterlimit:10;}
</style>
<g>
<polygon class="st0" points="-246.5,455.1 -247.5,457.1 -245.5,457.1 -246.5,455.1 "/>
<path class="st0" d="M-246.5,447c-4.7,0-8.5,3.8-8.5,8.5c0,5.8,7.7,15.6,8,16c0.1,0.2,0.3,0.3,0.5,0.3h0c0.2,0,0.4-0.1,0.5-0.3
c0.3-0.4,7.9-10.3,7.9-16C-238,450.8-241.8,447-246.5,447z M-242.5,460.1h-1.4c-0.2,0-0.3-0.1-0.4-0.3l-0.5-1h-3.4l-0.5,1
c-0.1,0.2-0.2,0.3-0.5,0.3h-1.4c-0.2,0-0.3-0.2-0.2-0.3l3.9-8.5c0-0.1,0.1-0.1,0.2-0.1h0.1c0.1,0,0.2,0.1,0.2,0.1l3.9,8.5
C-242.2,460-242.3,460.1-242.5,460.1z"/>
</g>
<g>
<path class="st0" d="M-197.7,466.4c-8,0-14.6,6.6-14.6,14.6c0,9.9,13.2,26.8,13.7,27.5c0.2,0.3,0.6,0.4,0.9,0.4c0,0,0,0,0,0
c0.4,0,0.7-0.2,0.9-0.4c0.6-0.7,13.6-17.6,13.6-27.5C-183.1,473-189.6,466.4-197.7,466.4z M-197.2,488.7h-5.3
c-0.2,0-0.4-0.2-0.4-0.4V474c0-0.2,0.2-0.4,0.4-0.4h5c2.5,0,4.6,1.7,4.6,4c0,1.7-1.5,2.9-2.5,3.4c1.1,0.5,2.9,1.5,2.9,3.5
C-192.5,486.9-194.6,488.7-197.2,488.7z"/>
<path class="st0" d="M-197.8,482.5h-1.7v3.1h2c0.8,0,1.5-0.7,1.5-1.6C-196,483.2-197,482.5-197.8,482.5z"/>
<path class="st0" d="M-196.4,478.2c0-0.9-0.7-1.5-1.5-1.5h-1.7v3h1.7C-197,479.7-196.4,479-196.4,478.2z"/>
</g>
<path class="st1" d="M-189.8,480"/>
<path class="st0" d="M-197.3,512.5l-38.9-21.3l9-4.8c0.9-0.5,1.4-1.5,1.3-2.5c-0.1-1-0.7-1.9-1.6-2.4c0,0-16.1-7.2-17.2-7.7
c-0.8-0.3-1.9-0.3-2.3-0.2c-1.2,0.3-2,1-2,1.8c0,1.2,2.1,1.9,2.4,2.1l15.3,6.7l-11.3,4.7c-0.9,0.5-1.4,1.5-1.3,2.5
c0,1,0.6,1.9,1.5,2.4l39.3,23.6c1.3,0.6,2.8,1.7,5.1,1.7c0.2,0,0.4,0,0.6,0c0,0,0,0,0.1,0c0.3,0,0.5,0,0.8-0.1
c1.9-0.4,3.3-1.5,3.3-2.8C-193.2,514.6-195,513.7-197.3,512.5z"/>
</svg>
<?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="-49 653 72 72" style="enable-background:new -49 653 72 72;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<path class="st0" d="M-13,725c-18.5,0-33.6-15.1-33.6-33.6c0-9.6,4.1-18.7,11.3-25.1c2-1.8,5-1.6,6.8,0.4c1.8,2,1.6,5-0.4,6.8
c-5.1,4.6-8.1,11.1-8.1,17.9c0,13.2,10.8,24,24,24c13.2,0,24-10.8,24-24c0-6.8-2.9-13.4-8-17.9c-2-1.8-2.2-4.8-0.4-6.8
c1.8-2,4.8-2.2,6.8-0.4c7.2,6.4,11.3,15.5,11.3,25.1C20.6,709.9,5.5,725-13,725z M-8.2,681.8v-24c0-2.7-2.1-4.8-4.8-4.8
s-4.8,2.1-4.8,4.8v24c0,2.7,2.1,4.8,4.8,4.8S-8.2,684.5-8.2,681.8z"/>
</svg>
/*===================================================================== /*=====================================================================
QGroundControl Open Source Ground Control Station QGroundControl Open Source Ground Control Station
(c) 2009 - 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> (c) 2009 - 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
This file is part of the QGROUNDCONTROL project This file is part of the QGROUNDCONTROL project
QGROUNDCONTROL is free software: you can redistribute it and/or modify QGROUNDCONTROL is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
QGROUNDCONTROL is distributed in the hope that it will be useful, QGROUNDCONTROL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>. along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/ ======================================================================*/
/// @file /// @file
...@@ -74,14 +74,14 @@ static const struct Modes2Name rgModes2Name[] = { ...@@ -74,14 +74,14 @@ static const struct Modes2Name rgModes2Name[] = {
{ PX4_CUSTOM_MAIN_MODE_ACRO, 0, "Acro", true }, { PX4_CUSTOM_MAIN_MODE_ACRO, 0, "Acro", true },
{ PX4_CUSTOM_MAIN_MODE_STABILIZED, 0, "Stabilized", true }, { PX4_CUSTOM_MAIN_MODE_STABILIZED, 0, "Stabilized", true },
{ PX4_CUSTOM_MAIN_MODE_RATTITUDE, 0, "Rattitude", true }, { PX4_CUSTOM_MAIN_MODE_RATTITUDE, 0, "Rattitude", true },
{ PX4_CUSTOM_MAIN_MODE_ALTCTL, 0, "Altitude control", true }, { PX4_CUSTOM_MAIN_MODE_ALTCTL, 0, "Altitude Control", true },
{ PX4_CUSTOM_MAIN_MODE_POSCTL, 0, "Position control", true }, { PX4_CUSTOM_MAIN_MODE_POSCTL, 0, "Position Control", true },
{ PX4_CUSTOM_MAIN_MODE_OFFBOARD, 0, "Offboard control", true }, { PX4_CUSTOM_MAIN_MODE_OFFBOARD, 0, "Offboard Control", true },
{ PX4_CUSTOM_MAIN_MODE_AUTO, PX4_CUSTOM_SUB_MODE_AUTO_READY, "Auto ready", false }, { PX4_CUSTOM_MAIN_MODE_AUTO, PX4_CUSTOM_SUB_MODE_AUTO_READY, "Auto Ready", false },
{ PX4_CUSTOM_MAIN_MODE_AUTO, PX4_CUSTOM_SUB_MODE_AUTO_TAKEOFF, "Taking off", false }, { PX4_CUSTOM_MAIN_MODE_AUTO, PX4_CUSTOM_SUB_MODE_AUTO_TAKEOFF, "Taking Off", false },
{ PX4_CUSTOM_MAIN_MODE_AUTO, PX4_CUSTOM_SUB_MODE_AUTO_LOITER, "Loiter", true }, { PX4_CUSTOM_MAIN_MODE_AUTO, PX4_CUSTOM_SUB_MODE_AUTO_LOITER, "Loiter", true },
{ PX4_CUSTOM_MAIN_MODE_AUTO, PX4_CUSTOM_SUB_MODE_AUTO_MISSION, "Mission", true }, { PX4_CUSTOM_MAIN_MODE_AUTO, PX4_CUSTOM_SUB_MODE_AUTO_MISSION, "Mission", true },
{ PX4_CUSTOM_MAIN_MODE_AUTO, PX4_CUSTOM_SUB_MODE_AUTO_RTL, "Return to Land", true }, { PX4_CUSTOM_MAIN_MODE_AUTO, PX4_CUSTOM_SUB_MODE_AUTO_RTL, "Return To Land", true },
{ PX4_CUSTOM_MAIN_MODE_AUTO, PX4_CUSTOM_SUB_MODE_AUTO_LAND, "Landing", false }, { PX4_CUSTOM_MAIN_MODE_AUTO, PX4_CUSTOM_SUB_MODE_AUTO_LAND, "Landing", false },
}; };
...@@ -89,55 +89,55 @@ static const struct Modes2Name rgModes2Name[] = { ...@@ -89,55 +89,55 @@ static const struct Modes2Name rgModes2Name[] = {
QList<VehicleComponent*> PX4FirmwarePlugin::componentsForVehicle(AutoPilotPlugin* vehicle) QList<VehicleComponent*> PX4FirmwarePlugin::componentsForVehicle(AutoPilotPlugin* vehicle)
{ {
Q_UNUSED(vehicle); Q_UNUSED(vehicle);
return QList<VehicleComponent*>(); return QList<VehicleComponent*>();
} }
QStringList PX4FirmwarePlugin::flightModes(void) QStringList PX4FirmwarePlugin::flightModes(void)
{ {
QStringList flightModes; QStringList flightModes;
// FIXME: fixed-wing/multi-rotor differences? // FIXME: fixed-wing/multi-rotor differences?
for (size_t i=0; i<sizeof(rgModes2Name)/sizeof(rgModes2Name[0]); i++) { for (size_t i=0; i<sizeof(rgModes2Name)/sizeof(rgModes2Name[0]); i++) {
const struct Modes2Name* pModes2Name = &rgModes2Name[i]; const struct Modes2Name* pModes2Name = &rgModes2Name[i];
if (pModes2Name->canBeSet) { if (pModes2Name->canBeSet) {
flightModes += pModes2Name->name; flightModes += pModes2Name->name;
} }
} }
return flightModes; return flightModes;
} }
QString PX4FirmwarePlugin::flightMode(uint8_t base_mode, uint32_t custom_mode) QString PX4FirmwarePlugin::flightMode(uint8_t base_mode, uint32_t custom_mode)
{ {
QString flightMode = "Unknown"; QString flightMode = "Unknown";
if (base_mode & MAV_MODE_FLAG_CUSTOM_MODE_ENABLED) { if (base_mode & MAV_MODE_FLAG_CUSTOM_MODE_ENABLED) {
union px4_custom_mode px4_mode; union px4_custom_mode px4_mode;
px4_mode.data = custom_mode; px4_mode.data = custom_mode;
// FIXME: fixed-wing/multi-rotor differences? // FIXME: fixed-wing/multi-rotor differences?
bool found = false; bool found = false;
for (size_t i=0; i<sizeof(rgModes2Name)/sizeof(rgModes2Name[0]); i++) { for (size_t i=0; i<sizeof(rgModes2Name)/sizeof(rgModes2Name[0]); i++) {
const struct Modes2Name* pModes2Name = &rgModes2Name[i]; const struct Modes2Name* pModes2Name = &rgModes2Name[i];
if (pModes2Name->main_mode == px4_mode.main_mode && pModes2Name->sub_mode == px4_mode.sub_mode) { if (pModes2Name->main_mode == px4_mode.main_mode && pModes2Name->sub_mode == px4_mode.sub_mode) {
flightMode = pModes2Name->name; flightMode = pModes2Name->name;
found = true; found = true;
break; break;
} }
} }
if (!found) { if (!found) {
qWarning() << "Unknown flight mode" << custom_mode; qWarning() << "Unknown flight mode" << custom_mode;
} }
} else { } else {
qWarning() << "PX4 Flight Stack flight mode without custom mode enabled?"; qWarning() << "PX4 Flight Stack flight mode without custom mode enabled?";
} }
return flightMode; return flightMode;
} }
...@@ -145,30 +145,30 @@ bool PX4FirmwarePlugin::setFlightMode(const QString& flightMode, uint8_t* base_m ...@@ -145,30 +145,30 @@ bool PX4FirmwarePlugin::setFlightMode(const QString& flightMode, uint8_t* base_m
{ {
*base_mode = 0; *base_mode = 0;
*custom_mode = 0; *custom_mode = 0;
bool found = false; bool found = false;
for (size_t i=0; i<sizeof(rgModes2Name)/sizeof(rgModes2Name[0]); i++) { for (size_t i=0; i<sizeof(rgModes2Name)/sizeof(rgModes2Name[0]); i++) {
const struct Modes2Name* pModes2Name = &rgModes2Name[i]; const struct Modes2Name* pModes2Name = &rgModes2Name[i];
if (flightMode.compare(pModes2Name->name, Qt::CaseInsensitive) == 0) { if (flightMode.compare(pModes2Name->name, Qt::CaseInsensitive) == 0) {
union px4_custom_mode px4_mode; union px4_custom_mode px4_mode;
px4_mode.data = 0; px4_mode.data = 0;
px4_mode.main_mode = pModes2Name->main_mode; px4_mode.main_mode = pModes2Name->main_mode;
px4_mode.sub_mode = pModes2Name->sub_mode; px4_mode.sub_mode = pModes2Name->sub_mode;
*base_mode = MAV_MODE_FLAG_CUSTOM_MODE_ENABLED; *base_mode = MAV_MODE_FLAG_CUSTOM_MODE_ENABLED;
*custom_mode = px4_mode.data; *custom_mode = px4_mode.data;
found = true; found = true;
break; break;
} }
} }
if (!found) { if (!found) {
qWarning() << "Unknown flight Mode" << flightMode; qWarning() << "Unknown flight Mode" << flightMode;
} }
return found; return found;
} }
...@@ -180,7 +180,7 @@ int PX4FirmwarePlugin::manualControlReservedButtonCount(void) ...@@ -180,7 +180,7 @@ int PX4FirmwarePlugin::manualControlReservedButtonCount(void)
void PX4FirmwarePlugin::adjustMavlinkMessage(mavlink_message_t* message) void PX4FirmwarePlugin::adjustMavlinkMessage(mavlink_message_t* message)
{ {
Q_UNUSED(message); Q_UNUSED(message);
// PX4 Flight Stack plugin does no message adjustment // PX4 Flight Stack plugin does no message adjustment
} }
...@@ -192,7 +192,7 @@ bool PX4FirmwarePlugin::isCapable(FirmwareCapabilities capabilities) ...@@ -192,7 +192,7 @@ bool PX4FirmwarePlugin::isCapable(FirmwareCapabilities capabilities)
void PX4FirmwarePlugin::initializeVehicle(Vehicle* vehicle) void PX4FirmwarePlugin::initializeVehicle(Vehicle* vehicle)
{ {
Q_UNUSED(vehicle); Q_UNUSED(vehicle);
// PX4 Flight Stack doesn't need to do any extra work // PX4 Flight Stack doesn't need to do any extra work
} }
......
...@@ -43,7 +43,11 @@ Item { ...@@ -43,7 +43,11 @@ Item {
QGCPalette { id: qgcPal; colorGroupEnabled: enabled } QGCPalette { id: qgcPal; colorGroupEnabled: enabled }
property var _activeVehicle: multiVehicleManager.activeVehicle property real avaiableHeight: parent.height
readonly property bool isBackgroundDark: _mainIsMap ? (_flightMap ? _flightMap.isSatelliteMap : true) : true
property var _activeVehicle: multiVehicleManager.activeVehicle
readonly property var _defaultVehicleCoordinate: QtPositioning.coordinate(37.803784, -122.462276) readonly property var _defaultVehicleCoordinate: QtPositioning.coordinate(37.803784, -122.462276)
readonly property real _defaultRoll: 0 readonly property real _defaultRoll: 0
...@@ -73,9 +77,6 @@ Item { ...@@ -73,9 +77,6 @@ Item {
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 _isBackgroundDark: _mainIsMap ? (_flightMap ? _flightMap.isSatelliteMap : true) : true
property var _flightMap: null property var _flightMap: null
property var _flightVideo: null property var _flightVideo: null
property var _savedZoomLevel: 0 property var _savedZoomLevel: 0
...@@ -130,7 +131,7 @@ Item { ...@@ -130,7 +131,7 @@ Item {
width: _pipSize width: _pipSize
height: _pipSize * (9/16) height: _pipSize * (9/16)
color: "#000010" color: "#000010"
border.color: _isBackgroundDark ? Qt.rgba(1,1,1,0.75) : Qt.rgba(0,0,0,0.75) border.color: isBackgroundDark ? Qt.rgba(1,1,1,0.75) : Qt.rgba(0,0,0,0.75)
Loader { Loader {
id: pipLoader id: pipLoader
anchors.fill: parent anchors.fill: parent
...@@ -181,7 +182,7 @@ Item { ...@@ -181,7 +182,7 @@ Item {
width: ScreenTools.defaultFontPixelSize * 2 width: ScreenTools.defaultFontPixelSize * 2
radius: ScreenTools.defaultFontPixelSize / 3 radius: ScreenTools.defaultFontPixelSize / 3
visible: _controller.hasVideo && !_isPipVisible visible: _controller.hasVideo && !_isPipVisible
color: _isBackgroundDark ? Qt.rgba(1,1,1,0.5) : Qt.rgba(0,0,0,0.5) color: isBackgroundDark ? Qt.rgba(1,1,1,0.5) : Qt.rgba(0,0,0,0.5)
Image { Image {
width: parent.width * 0.75 width: parent.width * 0.75
height: parent.height * 0.75 height: parent.height * 0.75
...@@ -203,6 +204,10 @@ Item { ...@@ -203,6 +204,10 @@ Item {
//-- Widgets //-- Widgets
Loader { Loader {
id: widgetsLoader id: widgetsLoader
anchors.fill: parent anchors.right: parent.right
anchors.left: parent.left
anchors.bottom: parent.bottom
height: avaiableHeight
} }
} }
...@@ -45,7 +45,7 @@ Item { ...@@ -45,7 +45,7 @@ Item {
text: "NO VIDEO" text: "NO VIDEO"
font.weight: Font.DemiBold font.weight: Font.DemiBold
color: "white" color: "white"
font.pixelSize: ScreenTools.defaultFontPixelSize * 1.5 font.pixelSize: _mainIsMap ? 12 * ScreenTools.fontHRatio : 20 * ScreenTools.fontHRatio
anchors.centerIn: parent anchors.centerIn: parent
} }
} }
......
...@@ -82,7 +82,7 @@ Item { ...@@ -82,7 +82,7 @@ Item {
anchors.right: parent.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
visible: _isInstrumentVisible visible: _isInstrumentVisible
size: mainWindow.width * 0.15 size: ScreenTools.isTinyScreen ? mainWindow.width * 0.2 : mainWindow.width * 0.15
active: _activeVehicle != null active: _activeVehicle != null
heading: _heading heading: _heading
rollAngle: _roll rollAngle: _roll
...@@ -108,7 +108,7 @@ Item { ...@@ -108,7 +108,7 @@ Item {
width: ScreenTools.defaultFontPixelSize * 2 width: ScreenTools.defaultFontPixelSize * 2
radius: ScreenTools.defaultFontPixelSize / 3 radius: ScreenTools.defaultFontPixelSize / 3
visible: !_isInstrumentVisible visible: !_isInstrumentVisible
color: _isBackgroundDark ? Qt.rgba(1,1,1,0.5) : Qt.rgba(0,0,0,0.5) color: isBackgroundDark ? Qt.rgba(1,1,1,0.5) : Qt.rgba(0,0,0,0.5)
Image { Image {
width: parent.width * 0.75 width: parent.width * 0.75
height: parent.height * 0.75 height: parent.height * 0.75
...@@ -130,6 +130,7 @@ Item { ...@@ -130,6 +130,7 @@ Item {
//-- Vertical Tool Buttons //-- Vertical Tool Buttons
Column { Column {
id: toolColumn id: toolColumn
visible: _mainIsMap
anchors.margins: ScreenTools.defaultFontPixelHeight anchors.margins: ScreenTools.defaultFontPixelHeight
anchors.left: parent.left anchors.left: parent.left
anchors.top: parent.top anchors.top: parent.top
......
...@@ -373,7 +373,7 @@ QGCView { ...@@ -373,7 +373,7 @@ QGCView {
// Mission Item Editor // Mission Item Editor
Item { Item {
id: missionItemEditor id: missionItemEditor
anchors.top: parent.top height: mainWindow.avaiableHeight
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.right: parent.right anchors.right: parent.right
width: _rightPanelWidth width: _rightPanelWidth
......
import QtQuick 2.2 import QtQuick 2.4
import QtQuick.Controls 1.2 import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2 import QtGraphicalEffects 1.0
import QtQuick.Controls.Private 1.0
import QGroundControl.Controls 1.0
import QGroundControl.Palette 1.0
Item {
id: _root
property alias source: icon.source
property bool checked: false
property ExclusiveGroup exclusiveGroup: null
signal clicked()
onExclusiveGroupChanged: {
if (exclusiveGroup) {
exclusiveGroup.bindCheckable(_root)
}
}
Image {
id: icon
width: parent.height * 0.9
height: parent.height * 0.9
mipmap: true
fillMode: Image.PreserveAspectFit
visible: false
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
}
ColorOverlay {
id: iconOverlay
anchors.fill: icon
source: icon
color: (checked ? "#ffff20" : "#ffffff")
}
MouseArea {
anchors.fill: parent
onClicked: {
checked = true
_root.clicked()
}
}
}
/*
QGCButton { QGCButton {
id: button id: button
property bool repaintChevron: false property bool repaintChevron: false
...@@ -62,3 +102,4 @@ QGCButton { ...@@ -62,3 +102,4 @@ QGCButton {
} }
} }
} }
*/
...@@ -23,17 +23,18 @@ ExclusiveGroupItem 1.0 ExclusiveGroupItem.qml ...@@ -23,17 +23,18 @@ ExclusiveGroupItem 1.0 ExclusiveGroupItem.qml
ParameterEditor 1.0 ParameterEditor.qml ParameterEditor 1.0 ParameterEditor.qml
ParameterEditorDialog 1.0 ParameterEditorDialog.qml ParameterEditorDialog 1.0 ParameterEditorDialog.qml
ModeSwitchDisplay 1.0 ModeSwitchDisplay.qml ModeSwitchDisplay 1.0 ModeSwitchDisplay.qml
QGCView 1.0 QGCView.qml QGCView 1.0 QGCView.qml
QGCViewPanel 1.0 QGCViewPanel.qml QGCViewPanel 1.0 QGCViewPanel.qml
QGCViewDialog 1.0 QGCViewDialog.qml QGCViewDialog 1.0 QGCViewDialog.qml
QGCViewMessage 1.0 QGCViewMessage.qml QGCViewMessage 1.0 QGCViewMessage.qml
MissionItemIndexLabel 1.0 MissionItemIndexLabel.qml MissionItemIndexLabel 1.0 MissionItemIndexLabel.qml
MissionItemSummary 1.0 MissionItemSummary.qml MissionItemSummary 1.0 MissionItemSummary.qml
MissionItemEditor 1.0 MissionItemEditor.qml MissionItemEditor 1.0 MissionItemEditor.qml
MainToolBar 1.0 MainToolBar.qml MainToolBar 1.0 MainToolBar.qml
SignalStrength 1.0 SignalStrength.qml
ClickableColor 1.0 ClickableColor.qml ClickableColor 1.0 ClickableColor.qml
...@@ -48,6 +48,9 @@ public: ...@@ -48,6 +48,9 @@ public:
Q_PROPERTY(qreal zOrderWidgets READ zOrderWidgets CONSTANT) ///< z order value to widgets, for example: zoom controls, hud widgetss Q_PROPERTY(qreal zOrderWidgets READ zOrderWidgets CONSTANT) ///< z order value to widgets, for example: zoom controls, hud widgetss
Q_PROPERTY(qreal zOrderMapItems READ zOrderMapItems CONSTANT) ///< z order value for map items, for example: mission item indicators Q_PROPERTY(qreal zOrderMapItems READ zOrderMapItems CONSTANT) ///< z order value for map items, for example: mission item indicators
/// Global "Advance Mode" preference. Certain UI elements and features are different based on this.
Q_PROPERTY(bool isAdvancedMode READ isAdvancedMode CONSTANT)
Q_INVOKABLE void saveGlobalSetting (const QString& key, const QString& value); Q_INVOKABLE void saveGlobalSetting (const QString& key, const QString& value);
Q_INVOKABLE QString loadGlobalSetting (const QString& key, const QString& defaultValue); Q_INVOKABLE QString loadGlobalSetting (const QString& key, const QString& defaultValue);
Q_INVOKABLE void saveBoolGlobalSetting (const QString& key, bool value); Q_INVOKABLE void saveBoolGlobalSetting (const QString& key, bool value);
...@@ -62,6 +65,9 @@ public: ...@@ -62,6 +65,9 @@ public:
qreal zOrderWidgets () { return 100; } qreal zOrderWidgets () { return 100; }
qreal zOrderMapItems () { return 50; } qreal zOrderMapItems () { return 50; }
//-- TODO: Make this into an actual preference.
bool isAdvancedMode () { return false; }
private: private:
HomePositionManager* _homePositionManager; HomePositionManager* _homePositionManager;
FlightMapSettings* _flightMapSettings; FlightMapSettings* _flightMapSettings;
......
...@@ -14,6 +14,12 @@ Item { ...@@ -14,6 +14,12 @@ Item {
readonly property real defaultFontPixelWidth: _textMeasure.fontWidth readonly property real defaultFontPixelWidth: _textMeasure.fontWidth
readonly property real smallFontPixelSize: defaultFontPixelSize * ScreenToolsController.smallFontPixelSizeRatio readonly property real smallFontPixelSize: defaultFontPixelSize * ScreenToolsController.smallFontPixelSizeRatio
// To proportionally scale fonts
readonly property real _defaultFontHeight: 16
readonly property real fontHRatio: isTinyScreen ? (_textMeasure.contentHeight / _defaultFontHeight) * 0.75 : (_textMeasure.contentHeight / _defaultFontHeight)
readonly property real realFontHeight: _textMeasure.contentHeight
// On OSX ElCapitan with Qt 5.4.0 any font pixel size above 19 shows garbage test. No idea why at this point. // On OSX ElCapitan with Qt 5.4.0 any font pixel size above 19 shows garbage test. No idea why at this point.
// Will remove Math.min when problem is figure out. // Will remove Math.min when problem is figure out.
readonly property real mediumFontPixelSize: Math.min(defaultFontPixelSize * ScreenToolsController.mediumFontPixelSizeRatio, ScreenToolsController.isMobile ? 10000 : 19) readonly property real mediumFontPixelSize: Math.min(defaultFontPixelSize * ScreenToolsController.mediumFontPixelSizeRatio, ScreenToolsController.isMobile ? 10000 : 19)
...@@ -36,7 +42,6 @@ Item { ...@@ -36,7 +42,6 @@ Item {
Text { Text {
id: _textMeasure id: _textMeasure
text: "X" text: "X"
property real fontWidth: contentWidth * (ScreenToolsController.testHighDPI ? 2 : 1) property real fontWidth: contentWidth * (ScreenToolsController.testHighDPI ? 2 : 1)
property real fontHeight: contentHeight * (ScreenToolsController.testHighDPI ? 2 : 1) property real fontHeight: contentHeight * (ScreenToolsController.testHighDPI ? 2 : 1)
} }
......
...@@ -36,7 +36,6 @@ import QGroundControl.ScreenTools 1.0 ...@@ -36,7 +36,6 @@ import QGroundControl.ScreenTools 1.0
import QGroundControl.MultiVehicleManager 1.0 import QGroundControl.MultiVehicleManager 1.0
Rectangle { Rectangle {
anchors.fill: parent
color: qgcPal.window color: qgcPal.window
z: QGroundControl.zOrderTopMost z: QGroundControl.zOrderTopMost
...@@ -204,10 +203,11 @@ Rectangle { ...@@ -204,10 +203,11 @@ Rectangle {
} }
Rectangle { Rectangle {
//anchors.margins: _defaultTextHeight * 2 //-- Fill entire screen, including behind tool bar
anchors.fill: parent anchors.fill: parent
color: qgcPal.windowShadeDark color: qgcPal.windowShadeDark
/* I think this takes too much space and is not exactly necessary
QGCLabel { QGCLabel {
id: title id: title
anchors.topMargin: _margin anchors.topMargin: _margin
...@@ -218,24 +218,27 @@ Rectangle { ...@@ -218,24 +218,27 @@ Rectangle {
font.pixelSize: ScreenTools.largeFontPixelSize font.pixelSize: ScreenTools.largeFontPixelSize
text: "Vehicle Setup" text: "Vehicle Setup"
} }
*/
Rectangle { Rectangle {
//-- Limit height to available height (below tool bar)
anchors.topMargin: _margin anchors.topMargin: _margin
anchors.top: title.bottom //anchors.top: title.bottom
height: mainWindow.avaiableHeight
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
color: qgcPal.window color: qgcPal.window
Flickable { ScrollView {
id: buttonFlickable id: buttonScroll
width: _buttonWidth width: _buttonWidth
anchors.topMargin: _defaultTextHeight / 2 anchors.topMargin: _defaultTextHeight / 2
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
contentWidth: _buttonWidth frameVisible: false
contentHeight: buttonColumn.height horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff
flickableDirection: Flickable.VerticalFlick verticalScrollBarPolicy: Qt.ScrollBarAlwaysOff
Column { Column {
id: buttonColumn id: buttonColumn
...@@ -314,13 +317,15 @@ Rectangle { ...@@ -314,13 +317,15 @@ Rectangle {
} }
} // Column } // Column
} // Flickable } // ScrollView
Loader { Loader {
id: panelLoader id: panelLoader
anchors.topMargin: _margin
anchors.bottomMargin: _margin
anchors.leftMargin: _defaultTextWidth anchors.leftMargin: _defaultTextWidth
anchors.rightMargin: _defaultTextWidth anchors.rightMargin: _defaultTextWidth
anchors.left: buttonFlickable.right anchors.left: buttonScroll.right
anchors.right: parent.right anchors.right: parent.right
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
......
...@@ -34,11 +34,11 @@ import QGroundControl.ScreenTools 1.0 ...@@ -34,11 +34,11 @@ import QGroundControl.ScreenTools 1.0
Item { Item {
id: mainWindow id: mainWindow
property var _toolbar: toolbarLoader.item
readonly property string _planViewSource: "MissionEditor.qml" readonly property string _planViewSource: "MissionEditor.qml"
readonly property string _setupViewSource: "SetupView.qml" readonly property string _setupViewSource: "SetupView.qml"
property real avaiableHeight: height - toolBar.height
Connections { Connections {
target: controller target: controller
...@@ -67,7 +67,7 @@ Item { ...@@ -67,7 +67,7 @@ Item {
planViewLoader.visible = false planViewLoader.visible = false
} }
onShowToolbarMessage: _toolbar.showToolbarMessage(message) onShowToolbarMessage: toolBar.showToolbarMessage(message)
// The following are use for unit testing only // The following are use for unit testing only
...@@ -77,11 +77,6 @@ Item { ...@@ -77,11 +77,6 @@ Item {
onShowSetupVehicleComponent: setupViewLoader.item.showVehicleComponentPanel(vehicleComponent) onShowSetupVehicleComponent: setupViewLoader.item.showVehicleComponentPanel(vehicleComponent)
} }
// We delay load the following control to improve boot time
Component.onCompleted: {
toolbarLoader.source = "MainToolBar.qml"
}
// Detect tablet position // Detect tablet position
property var tabletPosition: QtPositioning.coordinate(37.803784, -122.462276) property var tabletPosition: QtPositioning.coordinate(37.803784, -122.462276)
PositionSource { PositionSource {
...@@ -97,41 +92,37 @@ Item { ...@@ -97,41 +92,37 @@ Item {
} }
} }
Loader { MainToolBar {
id: toolbarLoader id: toolBar
width: parent.width height: ScreenTools.isMobile ? (ScreenTools.isTinyScreen ? (mainWindow.width * 0.0666) : (mainWindow.width * 0.0444)) : ScreenTools.defaultFontPixelSize * 4
height: item ? item.height : 0 anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
isBackgroundDark: flightView.isBackgroundDark
z: QGroundControl.zOrderTopMost z: QGroundControl.zOrderTopMost
} }
FlightDisplayView { FlightDisplayView {
id: flightView id: flightView
anchors.left: parent.left anchors.fill: parent
anchors.right: parent.right avaiableHeight: mainWindow.avaiableHeight
anchors.top: toolbarLoader.bottom visible: true
anchors.bottom: parent.bottom
visible: true
} }
Loader { Loader {
id: planViewLoader id: planViewLoader
anchors.left: parent.left anchors.fill: parent
anchors.right: parent.right
anchors.top: toolbarLoader.bottom
anchors.bottom: parent.bottom
visible: false visible: false
property var tabletPosition: mainWindow.tabletPosition property var tabletPosition: mainWindow.tabletPosition
} }
Loader { Loader {
id: setupViewLoader id: setupViewLoader
anchors.left: parent.left
anchors.right: parent.right
anchors.top: toolbarLoader.bottom
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.right: parent.right
anchors.left: parent.left
height: mainWindow.avaiableHeight
visible: false visible: false
property var tabletPosition: mainWindow.tabletPosition property var tabletPosition: mainWindow.tabletPosition
} }
} }
/*=====================================================================
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 Main Tool GPS
* @author Gus Grubba <mavlink@grubba.com>
*/
import QtQuick 2.4
import QGroundControl.Controls 1.0
Item {
id: gpsRoot
property real size: 50
property real percent: 0
width: size
height: size
Image {
source: "/qmlimages/Gps.svg"
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
anchors.fill: parent
opacity: (percent + 25) * 0.8
}
}
<?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="svg2474" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:cc="http://creativecommons.org/ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" sodipodi:docname="airplane_topdown.svg" inkscape:version="0.46" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:version="0.32"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="78 206 72 72"
style="enable-background:new 78 206 72 72;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<path class="st0" d="M85.4,213.4l1.6,2.7l-8.6,9.2c-0.5,0.5-0.5,1.4,0,1.9l2.2,2.6c0.8,0.9,2.2,1.1,3.2,0.4l9.3-6.3l12.5,17.4
l-23.4,28.5c-0.5,0.6-0.6,1.5-0.2,2.2l0.7,1.3c0.9,1.5,2.1,2.8,3.6,3.8l0.9,0.6c0.8,0.5,1.7,0.4,2.4-0.2l25.5-23.9
c0.6-0.6,1.6-0.6,2.2,0l4.9,4.4l5.8,3.5l1.6-0.5l4,0.8l-0.7-4l0.5-1.6l-3.5-5.8l-4.4-4.9c-0.6-0.6-0.5-1.6,0-2.2l23.9-25.5
c0.6-0.7,0.7-1.6,0.2-2.4l-0.6-0.9c-0.9-1.5-2.2-2.7-3.8-3.6l-1.3-0.7c-0.7-0.4-1.6-0.3-2.2,0.2l-28.5,23.4L96,221.1l6.3-9.3
c0.7-1,0.5-2.4-0.4-3.2l-2.6-2.2c-0.6-0.5-1.4-0.5-1.9,0l-9.2,8.6C88.1,214.9,85.4,213.4,85.4,213.4z"/>
</svg>
<?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" style="enable-background:new 0 0 72 72;" xml:space="preserve">
<style type="text/css">
.st0{fill:#66BD59;stroke:#FFFFFF;stroke-width:5;stroke-miterlimit:10;}
.st1{fill:none;stroke:#FFFFFF;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
</style>
<circle class="st0" cx="36" cy="36" r="32.4"/>
<polyline class="st1" points="55.1,19.8 30.2,52.2 16.9,36.5 "/>
</svg>
<?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" style="enable-background:new 0 0 72 72;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{fill:#FFFFFF;stroke:#FFFFFF;stroke-width:6;stroke-miterlimit:10;}
.st2{fill:#FFFFFF;stroke:#FFFFFF;stroke-width:2;}
</style>
<path id="rect4360" inkscape:connector-curvature="0" class="st0" d="M14.4,65.5v-55c0-1.6,1.9-2.9,4.2-2.9h34.7
c2.4,0,4.2,1.3,4.2,2.9v55c0,1.6-1.9,2.9-4.2,2.9H18.7C16.3,68.4,14.4,67.1,14.4,65.5z"/>
<g id="g4222" transform="translate(-127.22081,216.20249)">
<path id="path4224" inkscape:connector-curvature="0" class="st1" d="M171.9-208c0,0.2-0.2,0.4-0.4,0.4H155c-0.2,0-0.4-0.2-0.4-0.4
v-4.2c0-0.2,0.2-0.4,0.4-0.4h16.5c0.2,0,0.4,0.2,0.4,0.4V-208L171.9-208L171.9-208z"/>
</g>
<path class="st2" d="M51.6,9.4H19.6c-2.2,0-3.9,1.3-3.9,2.8v52.9c0,1.6,1.7,2.8,3.9,2.8h31.9c2.2,0,3.9-1.3,3.9-2.8V12.2
C55.5,10.6,53.7,9.4,51.6,9.4z M20.6,24h30.1v8.2H20.6V24z M50.6,63.8H20.6v-8.2h30.1V63.8z M50.6,53.3H20.6v-8.2h30.1V53.3z
M50.6,42.8H20.6v-8.2h30.1V42.8z M50.6,21.7H20.6v-8.2h30.1V21.7z"/>
</svg>
<?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="264 336 72 72" style="enable-background:new 264 336 72 72;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<circle class="st0" cx="300" cy="397.3" r="7.1"/>
<path class="st0" d="M300.7,388.2h-1c-2.4,0-4.4-2.2-4.4-5l-3.2-38.6c0-2.7,2-5,4.4-5h7.3c2.4,0,4.4,2.2,4.4,5l-3.1,38.6
C305,386,303.1,388.2,300.7,388.2z"/>
<g>
<path class="st0" d="M290,350.4c-8.9,1.9-17.1,6.3-23.7,12.9l5.7,5.6c5.1-5.1,11.3-8.6,18-10.4V350.4z"/>
<path class="st0" d="M310,350.4v8.2c6.8,1.8,13,5.3,18,10.4l5.7-5.6C327.1,356.7,318.9,352.3,310,350.4z"/>
</g>
<g>
<path class="st0" d="M289,370.4c-3.5,1.4-6.7,3.5-9.4,6.3l5.6,5.7c1.2-1.1,2.4-2.1,3.8-3V370.4z"/>
<path class="st0" d="M309,369.7v8.6c2.1,1,4.1,2.3,5.8,4l5.6-5.7C317.2,373.5,313.3,371.1,309,369.7z"/>
</g>
</svg>
<?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" style="enable-background:new 0 0 72 72;" xml:space="preserve">
<style type="text/css">
.st0{fill:#F0493C;stroke:#FFFFFF;stroke-width:5;stroke-miterlimit:10;}
.st1{fill:none;stroke:#FFFFFF;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
</style>
<circle class="st0" cx="36" cy="36" r="32.4"/>
<g>
<line class="st1" x1="21.6" y1="22.4" x2="50.4" y2="49.6"/>
<line class="st1" x1="22.4" y1="50.4" x2="49.6" y2="21.6"/>
</g>
</svg>
<?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="220 292 72 72" style="enable-background:new 220 292 72 72;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<path class="st0" d="M234.4,310.4l-10-10c-1.1-1.1-1.1-2.9,0-3.9c1.1-1.1,2.9-1.1,3.9,0l10,10c7.7-5.7,18.6-5.1,25.5,1.8l-27.6,27.6
C229.3,328.9,228.7,318,234.4,310.4z M275.7,320.1c7,7,7.6,17.9,1.8,25.5l10,10c1.1,1.1,1.1,2.9,0,3.9c-1.1,1.1-2.9,1.1-3.9,0
l-10-10c-7.7,5.7-18.6,5.1-25.5-1.8l5.9-5.9l-4.9-4.9c-1.6-1.6-1.6-4.3,0-5.9c1.6-1.6,4.3-1.6,5.9,0l4.9,4.9l3.9-3.9L259,327
c-1.6-1.6-1.6-4.3,0-5.9c1.6-1.6,4.3-1.6,5.9,0l4.9,4.9L275.7,320.1z"/>
</svg>
<?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="svg3852" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:cc="http://creativecommons.org/ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" sodipodi:docname="gps.svg" inkscape:version="0.91 r13725"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-250 452 72 72"
style="enable-background:new -250 452 72 72;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;}
.st2{fill:none;stroke:#EB008B;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st3{fill:#FFFFFF;stroke:#FFFFFF;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st4{fill:none;stroke:#FFFFFF;stroke-width:3.9;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st5{fill:none;stroke:#FFFFFF;stroke-width:4.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st6{display:inline;fill:none;stroke:#224A80;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
</style>
<title id="title4758">GPS</title>
<sodipodi:namedview inkscape:cy="55" bordercolor="#666666" showgrid="false" borderopacity="1" objecttolerance="10" guidetolerance="10" inkscape:cx="55" inkscape:zoom="11.136364" gridtolerance="10" pagecolor="#808080" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-height="480" inkscape:current-layer="svg3852" inkscape:window-width="640" id="namedview3929">
</sodipodi:namedview>
<g id="Layer_2" class="st0">
</g>
<g id="ex_thick" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_3" class="st0">
</g>
<g id="ex_thin" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy" class="st0">
</g>
<g id="em_thick" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_4" class="st0">
<g id="g3861" class="st1">
<rect id="rect3863" x="-286.1" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3865" class="st2" cx="-258" cy="348.8" r="28.2"/>
</g>
<g id="g3867" class="st1">
<rect id="rect3869" x="-221.7" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3871" class="st2" cx="-193.5" cy="348.8" r="28.2"/>
</g>
<g id="g3873" class="st1">
<rect id="rect3875" x="-158.5" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3877" class="st2" cx="-130.3" cy="348.8" r="28.2"/>
</g>
</g>
<rect id="rect3882" x="-245.5" y="497.4" transform="matrix(-0.7071 0.7071 -0.7071 -0.7071 -44.474 1024.2881)" class="st3" width="22.3" height="11.1"/>
<rect id="rect3884" x="-210.1" y="462" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -388.8625 -3.7341)" class="st3" width="22.3" height="11.1"/>
<path id="path3886" inkscape:connector-curvature="0" class="st3" d="M-230.5,471.4c-3.2,3.2-3.2,8.6,0,11.8l15.8,15.7l11.8-11.8
l-15.7-15.7C-221.9,468.2-227.2,468.2-230.5,471.4z"/>
<path id="path3888" inkscape:connector-curvature="0" class="st3" d="M-208.8,493.1c-4.3,4.3-4.3,11.4,0,15.7l15.7-15.7
C-197.4,488.8-204.5,488.8-208.8,493.1z"/>
<path id="path3890" inkscape:connector-curvature="0" class="st4" d="M-207.1,516.3c5.7,5.7,15,5.7,20.7,0c5.7-5.7,5.7-15,0-20.7"/>
<path id="path3892" inkscape:connector-curvature="0" class="st4" d="M-201.9,509.4c2.5,2.5,6.4,2.5,8.9,0c2.5-2.5,2.5-6.4,0-8.9"/>
<line id="line3894" class="st5" x1="-226.5" y1="495" x2="-222.5" y2="491.1"/>
<line id="line3896" class="st5" x1="-210.7" y1="479.3" x2="-206.8" y2="475.4"/>
<g id="Layer_2_copy_2" class="st0">
<g id="g3905" class="st1">
<rect id="rect3907" x="-286.1" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3909" class="st2" cx="-258" cy="453.5" r="28.2"/>
</g>
<g id="g3911" class="st1">
<rect id="rect3913" x="-221.7" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3915" class="st2" cx="-193.5" cy="453.5" r="28.2"/>
</g>
<g id="g3917" class="st1">
<rect id="rect3919" x="-158.5" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3921" class="st2" cx="-130.3" cy="453.5" r="28.2"/>
</g>
</g>
<g id="hornet" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_5" class="st0">
</g>
<g id="hornet_THIN" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_6" class="st0">
<polygon id="polygon3927" class="st6" points="-264.6,453.2 -269.5,453.2 -269.5,494.2 -246.6,494.2 -246.6,453.2 -251.5,453.2
-251.5,446.7 -264.6,446.7 "/>
</g>
</svg>
<?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="-255 447 72 72" style="enable-background:new -255 447 72 72;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<g>
<path class="st0" d="M-240.7,462.4c-7.9,0-14.3,6.4-14.3,14.3s6.4,14.3,14.3,14.3c1.3,0,2.4-1,2.6-2.2h0V465
C-238.1,463.6-239.3,462.4-240.7,462.4z"/>
<path class="st0" d="M-183,450.8c0-1.4-1.2-2.6-2.6-2.6c-0.6,0-1.1,0.2-1.6,0.5l-22.9,13.2h-20.6c-1.4,0-2.6,1.2-2.6,2.6v24.7h0
c0.2,1.3,1.2,2.3,2.6,2.3h18.3l25,14.5c0.5,0.4,1.1,0.7,1.8,0.7c1.4,0,2.6-1.2,2.6-2.6c0-0.1,0-0.2,0-0.3h0v-4.4v-44.1v-4.4h0
C-183,450.9-183,450.8-183,450.8z"/>
<path class="st0" d="M-213.1,511.3L-213.1,511.3c0-0.1-0.1-0.1-0.1-0.1c0,0,0,0,0-0.1l-7.9-13.8l0,0c-0.4-0.6-1.1-1-1.8-1v0h-6.9v0
c-0.4,0-0.7,0.1-1.1,0.3c-1.2,0.7-1.7,2.3-1,3.6c0.1,0.1,0.1,0.2,0.2,0.3l0,0l9.3,16c0,0,0,0,0,0c0,0,0,0,0,0l0.1,0.2l0,0
c0.8,1.1,2.3,1.5,3.4,0.8c0.1-0.1,0.3-0.2,0.4-0.3l0,0l4.8-2.8l0,0C-212.8,513.7-212.5,512.4-213.1,511.3L-213.1,511.3z"/>
</g>
</svg>
<?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="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:cc="http://creativecommons.org/ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" sodipodi:docname="quad_icone.svg" inkscape:version="0.48.5 r10040"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="214 286 72 72"
style="enable-background:new 214 286 72 72;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;stroke:#FFFFFF;}
.st1{fill:none;stroke:#FFFFFF;stroke-width:3;stroke-linecap:round;}
.st2{fill:none;stroke:#FFFFFF;stroke-width:3;}
.st3{fill:#FFFFFF;stroke:#FFFFFF;stroke-width:3;}
</style>
<defs>
<inkscape:path-effect vertical_pattern="false" id="path-effect4881" spacing="0" fuse_tolerance="0" copytype="repeated" effect="skeletal" prop_units="false" prop_scale="1" scale_y_rel="false" normal_offset="0" pattern="M 0,0 1,0" is_visible="true" tang_offset="0">
</inkscape:path-effect>
<inkscape:path-effect id="path-effect3765" bendpath="m 110,180 140,0" effect="bend_path" prop_scale="1" scale_y_rel="false" vertical="false" is_visible="true">
</inkscape:path-effect>
</defs>
<sodipodi:namedview inkscape:cy="221.0125" bordercolor="#666666" showgrid="true" borderopacity="1.0" inkscape:cx="282.69484" inkscape:zoom="2.8" pagecolor="#ffffff" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-height="1017" inkscape:window-maximized="1" inkscape:guide-bbox="true" inkscape:current-layer="layer1" inkscape:window-width="1920" id="base" showguides="true" inkscape:document-units="px" inkscape:window-x="-8" inkscape:window-y="-8">
<sodipodi:guide id="guide2985" position="250,420" orientation="1,0"></sodipodi:guide>
<inkscape:grid type="xygrid" snapvisiblegridlinesonly="true" id="grid2987" enabled="true" empspacing="10" visible="true">
</inkscape:grid>
<sodipodi:guide id="guide2989" position="270,250" orientation="0,1"></sodipodi:guide>
</sodipodi:namedview>
<g>
<path id="path2991" sodipodi:type="arc" sodipodi:cy="110" sodipodi:cx="110" sodipodi:rx="20" sodipodi:ry="20" class="st0" d="
M230.5,299.3c0,1.8-1.4,3.2-3.2,3.2s-3.2-1.4-3.2-3.2s1.4-3.2,3.2-3.2S230.5,297.5,230.5,299.3z"/>
<path id="path3761" sodipodi:start="1.374765" sodipodi:type="arc" sodipodi:cy="110" sodipodi:cx="110" sodipodi:rx="50" sodipodi:end="6.4866523" sodipodi:open="true" sodipodi:ry="50" class="st1" d="
M229.2,308.8c-5.3,1-10.4-2.4-11.4-7.6c-1-5.3,2.4-10.4,7.6-11.4c5.3-1,10.4,2.4,11.4,7.6c0.3,1.3,0.2,2.6,0,3.8"/>
<path id="path2991-6" inkscape:transform-center-x="-140.5" inkscape:transform-center-y="-140.5" sodipodi:type="arc" sodipodi:cy="110" sodipodi:cx="110" sodipodi:rx="20" sodipodi:ry="20" class="st0" d="
M272.7,302.5c-1.8,0-3.2-1.4-3.2-3.2s1.4-3.2,3.2-3.2s3.2,1.4,3.2,3.2S274.5,302.5,272.7,302.5z"/>
<path id="path3761-1" inkscape:transform-center-x="-140.5" inkscape:transform-center-y="-140.50478" sodipodi:start="1.374765" sodipodi:type="arc" sodipodi:cy="110" sodipodi:cx="110" sodipodi:rx="50" sodipodi:end="6.4866523" sodipodi:open="true" sodipodi:ry="50" class="st1" d="
M263.2,301.2c-1-5.3,2.4-10.4,7.6-11.4c5.3-1,10.4,2.4,11.4,7.6c1,5.3-2.4,10.4-7.6,11.4c-1.3,0.3-2.6,0.2-3.8,0"/>
<path id="path2991-9" sodipodi:type="arc" sodipodi:cy="110" sodipodi:cx="110" sodipodi:rx="20" sodipodi:ry="20" class="st0" d="
M269.5,344.7c0-1.8,1.4-3.2,3.2-3.2s3.2,1.4,3.2,3.2s-1.4,3.2-3.2,3.2S269.5,346.5,269.5,344.7z"/>
<path id="path3761-2" sodipodi:start="1.374765" sodipodi:type="arc" sodipodi:cy="110" sodipodi:cx="110" sodipodi:rx="50" sodipodi:end="6.4866523" sodipodi:open="true" sodipodi:ry="50" class="st1" d="
M270.8,335.2c5.3-1,10.4,2.4,11.4,7.6c1,5.3-2.4,10.4-7.6,11.4c-5.3,1-10.4-2.4-11.4-7.6c-0.3-1.3-0.2-2.6,0-3.8"/>
<path id="path2991-6-9" inkscape:transform-center-x="140.5" inkscape:transform-center-y="140.50002" sodipodi:type="arc" sodipodi:cy="110" sodipodi:cx="110" sodipodi:rx="20" sodipodi:ry="20" class="st0" d="
M227.3,341.5c1.8,0,3.2,1.4,3.2,3.2s-1.4,3.2-3.2,3.2s-3.2-1.4-3.2-3.2S225.5,341.5,227.3,341.5z"/>
<path id="path3761-1-5" inkscape:transform-center-x="140.5" inkscape:transform-center-y="140.50476" sodipodi:start="1.374765" sodipodi:type="arc" sodipodi:cy="110" sodipodi:cx="110" sodipodi:rx="50" sodipodi:end="6.4866523" sodipodi:open="true" sodipodi:ry="50" class="st1" d="
M236.8,342.8c1,5.3-2.4,10.4-7.6,11.4c-5.3,1-10.4-2.4-11.4-7.6c-1-5.3,2.4-10.4,7.6-11.4c1.3-0.3,2.6-0.2,3.8,0"/>
</g>
<line class="st2" x1="227.3" y1="344.7" x2="272.7" y2="299.3"/>
<line class="st2" x1="272.7" y1="344.7" x2="227.3" y2="299.3"/>
<circle class="st3" cx="250" cy="322" r="13"/>
</svg>
<?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="svg3852" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:cc="http://creativecommons.org/ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" sodipodi:docname="gps.svg" inkscape:version="0.91 r13725"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-250 452 72 72"
style="enable-background:new -250 452 72 72;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;}
.st2{fill:none;stroke:#EB008B;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st3{display:inline;fill:none;stroke:#224A80;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st4{fill:none;stroke:#FFFFFF;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st5{fill:#FFFFFF;}
.st6{fill:#FFFFFF;stroke:#FFFFFF;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
</style>
<title id="title4758">GPS</title>
<sodipodi:namedview inkscape:cy="55" bordercolor="#666666" showgrid="false" borderopacity="1" objecttolerance="10" guidetolerance="10" inkscape:cx="55" inkscape:zoom="11.136364" gridtolerance="10" pagecolor="#808080" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-height="480" inkscape:current-layer="svg3852" inkscape:window-width="640" id="namedview3929">
</sodipodi:namedview>
<g id="Layer_2" class="st0">
</g>
<g id="ex_thick" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_3" class="st0">
</g>
<g id="ex_thin" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy" class="st0">
</g>
<g id="em_thick" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_4" class="st0">
<g id="g3861" class="st1">
<rect id="rect3863" x="-286.1" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3865" class="st2" cx="-258" cy="348.8" r="28.2"/>
</g>
<g id="g3867" class="st1">
<rect id="rect3869" x="-221.7" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3871" class="st2" cx="-193.5" cy="348.8" r="28.2"/>
</g>
<g id="g3873" class="st1">
<rect id="rect3875" x="-158.5" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3877" class="st2" cx="-130.3" cy="348.8" r="28.2"/>
</g>
</g>
<g id="Layer_2_copy_2" class="st0">
<g id="g3905" class="st1">
<rect id="rect3907" x="-286.1" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3909" class="st2" cx="-258" cy="453.5" r="28.2"/>
</g>
<g id="g3911" class="st1">
<rect id="rect3913" x="-221.7" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3915" class="st2" cx="-193.5" cy="453.5" r="28.2"/>
</g>
<g id="g3917" class="st1">
<rect id="rect3919" x="-158.5" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3921" class="st2" cx="-130.3" cy="453.5" r="28.2"/>
</g>
</g>
<g id="hornet" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_5" class="st0">
</g>
<g id="hornet_THIN" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_6" class="st0">
<polygon id="polygon3927" class="st3" points="-264.6,453.2 -269.5,453.2 -269.5,494.2 -246.6,494.2 -246.6,453.2 -251.5,453.2
-251.5,446.7 -264.6,446.7 "/>
</g>
<line class="st4" x1="-214" y1="479.9" x2="-214" y2="459.8"/>
<circle class="st5" cx="-227" cy="497" r="4.1"/>
<path class="st6" d="M-237,481.9v30.3h46.8v-30.3H-237z M-227,505.7c-4.8,0-8.7-3.9-8.7-8.7s3.9-8.7,8.7-8.7c4.8,0,8.7,3.9,8.7,8.7
S-222.2,505.7-227,505.7z M-200.1,505.7c-4.8,0-8.7-3.9-8.7-8.7s3.9-8.7,8.7-8.7c4.8,0,8.7,3.9,8.7,8.7S-195.3,505.7-200.1,505.7z"
/>
<circle class="st5" cx="-200.1" cy="497" r="4.1"/>
</svg>
<?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="svg3852" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:cc="http://creativecommons.org/ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" sodipodi:docname="gps.svg" inkscape:version="0.91 r13725"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-250 452 72 72"
style="enable-background:new -250 452 72 72;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;}
.st2{fill:none;stroke:#EB008B;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st3{display:inline;fill:none;stroke:#224A80;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st4{opacity:0.5;fill:#FFFFFF;}
.st5{opacity:0.6;fill:#FFFFFF;}
</style>
<title id="title4758">GPS</title>
<sodipodi:namedview inkscape:cy="55" bordercolor="#666666" showgrid="false" borderopacity="1" objecttolerance="10" guidetolerance="10" inkscape:cx="55" inkscape:zoom="11.136364" gridtolerance="10" pagecolor="#808080" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-height="480" inkscape:current-layer="svg3852" inkscape:window-width="640" id="namedview3929">
</sodipodi:namedview>
<g id="Layer_2" class="st0">
</g>
<g id="ex_thick" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_3" class="st0">
</g>
<g id="ex_thin" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy" class="st0">
</g>
<g id="em_thick" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_4" class="st0">
<g id="g3861" class="st1">
<rect id="rect3863" x="-286.1" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3865" class="st2" cx="-258" cy="348.8" r="28.2"/>
</g>
<g id="g3867" class="st1">
<rect id="rect3869" x="-221.7" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3871" class="st2" cx="-193.5" cy="348.8" r="28.2"/>
</g>
<g id="g3873" class="st1">
<rect id="rect3875" x="-158.5" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3877" class="st2" cx="-130.3" cy="348.8" r="28.2"/>
</g>
</g>
<g id="Layer_2_copy_2" class="st0">
<g id="g3905" class="st1">
<rect id="rect3907" x="-286.1" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3909" class="st2" cx="-258" cy="453.5" r="28.2"/>
</g>
<g id="g3911" class="st1">
<rect id="rect3913" x="-221.7" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3915" class="st2" cx="-193.5" cy="453.5" r="28.2"/>
</g>
<g id="g3917" class="st1">
<rect id="rect3919" x="-158.5" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3921" class="st2" cx="-130.3" cy="453.5" r="28.2"/>
</g>
</g>
<g id="hornet" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_5" class="st0">
</g>
<g id="hornet_THIN" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_6" class="st0">
<polygon id="polygon3927" class="st3" points="-264.6,453.2 -269.5,453.2 -269.5,494.2 -246.6,494.2 -246.6,453.2 -251.5,453.2
-251.5,446.7 -264.6,446.7 "/>
</g>
<rect x="-250" y="509.6" class="st4" width="8.6" height="14.4"/>
<rect x="-234.2" y="495.2" class="st4" width="8.6" height="28.8"/>
<rect x="-218.3" y="480.8" class="st5" width="8.6" height="43.2"/>
<rect x="-202.5" y="466.4" class="st4" width="8.6" height="57.6"/>
<rect x="-186.6" y="452" class="st4" width="8.6" height="72"/>
</svg>
<?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="svg3852" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:cc="http://creativecommons.org/ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" sodipodi:docname="gps.svg" inkscape:version="0.91 r13725"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-250 452 72 72"
style="enable-background:new -250 452 72 72;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;}
.st2{fill:none;stroke:#EB008B;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st3{display:inline;fill:none;stroke:#224A80;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st4{fill:#FFFFFF;}
</style>
<title id="title4758">GPS</title>
<sodipodi:namedview inkscape:cy="55" bordercolor="#666666" showgrid="false" borderopacity="1" objecttolerance="10" guidetolerance="10" inkscape:cx="55" inkscape:zoom="11.136364" gridtolerance="10" pagecolor="#808080" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-height="480" inkscape:current-layer="svg3852" inkscape:window-width="640" id="namedview3929">
</sodipodi:namedview>
<g id="Layer_2" class="st0">
</g>
<g id="ex_thick" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_3" class="st0">
</g>
<g id="ex_thin" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy" class="st0">
</g>
<g id="em_thick" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_4" class="st0">
<g id="g3861" class="st1">
<rect id="rect3863" x="-286.1" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3865" class="st2" cx="-258" cy="348.8" r="28.2"/>
</g>
<g id="g3867" class="st1">
<rect id="rect3869" x="-221.7" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3871" class="st2" cx="-193.5" cy="348.8" r="28.2"/>
</g>
<g id="g3873" class="st1">
<rect id="rect3875" x="-158.5" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3877" class="st2" cx="-130.3" cy="348.8" r="28.2"/>
</g>
</g>
<g id="Layer_2_copy_2" class="st0">
<g id="g3905" class="st1">
<rect id="rect3907" x="-286.1" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3909" class="st2" cx="-258" cy="453.5" r="28.2"/>
</g>
<g id="g3911" class="st1">
<rect id="rect3913" x="-221.7" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3915" class="st2" cx="-193.5" cy="453.5" r="28.2"/>
</g>
<g id="g3917" class="st1">
<rect id="rect3919" x="-158.5" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3921" class="st2" cx="-130.3" cy="453.5" r="28.2"/>
</g>
</g>
<g id="hornet" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_5" class="st0">
</g>
<g id="hornet_THIN" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_6" class="st0">
<polygon id="polygon3927" class="st3" points="-264.6,453.2 -269.5,453.2 -269.5,494.2 -246.6,494.2 -246.6,453.2 -251.5,453.2
-251.5,446.7 -264.6,446.7 "/>
</g>
<rect x="-250" y="509.6" class="st4" width="8.6" height="14.4"/>
<rect x="-234.2" y="495.2" class="st4" width="8.6" height="28.8"/>
<rect x="-218.3" y="480.8" class="st4" width="8.6" height="43.2"/>
<rect x="-202.5" y="466.4" class="st4" width="8.6" height="57.6"/>
<rect x="-186.6" y="452" class="st4" width="8.6" height="72"/>
</svg>
<?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="svg3852" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:cc="http://creativecommons.org/ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" sodipodi:docname="gps.svg" inkscape:version="0.91 r13725"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-250 452 72 72"
style="enable-background:new -250 452 72 72;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;}
.st2{fill:none;stroke:#EB008B;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st3{display:inline;fill:none;stroke:#224A80;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st4{fill:#FFFFFF;}
.st5{opacity:0.5;fill:#FFFFFF;}
.st6{opacity:0.6;fill:#FFFFFF;}
</style>
<title id="title4758">GPS</title>
<sodipodi:namedview inkscape:cy="55" bordercolor="#666666" showgrid="false" borderopacity="1" objecttolerance="10" guidetolerance="10" inkscape:cx="55" inkscape:zoom="11.136364" gridtolerance="10" pagecolor="#808080" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-height="480" inkscape:current-layer="svg3852" inkscape:window-width="640" id="namedview3929">
</sodipodi:namedview>
<g id="Layer_2" class="st0">
</g>
<g id="ex_thick" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_3" class="st0">
</g>
<g id="ex_thin" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy" class="st0">
</g>
<g id="em_thick" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_4" class="st0">
<g id="g3861" class="st1">
<rect id="rect3863" x="-286.1" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3865" class="st2" cx="-258" cy="348.8" r="28.2"/>
</g>
<g id="g3867" class="st1">
<rect id="rect3869" x="-221.7" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3871" class="st2" cx="-193.5" cy="348.8" r="28.2"/>
</g>
<g id="g3873" class="st1">
<rect id="rect3875" x="-158.5" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3877" class="st2" cx="-130.3" cy="348.8" r="28.2"/>
</g>
</g>
<g id="Layer_2_copy_2" class="st0">
<g id="g3905" class="st1">
<rect id="rect3907" x="-286.1" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3909" class="st2" cx="-258" cy="453.5" r="28.2"/>
</g>
<g id="g3911" class="st1">
<rect id="rect3913" x="-221.7" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3915" class="st2" cx="-193.5" cy="453.5" r="28.2"/>
</g>
<g id="g3917" class="st1">
<rect id="rect3919" x="-158.5" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3921" class="st2" cx="-130.3" cy="453.5" r="28.2"/>
</g>
</g>
<g id="hornet" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_5" class="st0">
</g>
<g id="hornet_THIN" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_6" class="st0">
<polygon id="polygon3927" class="st3" points="-264.6,453.2 -269.5,453.2 -269.5,494.2 -246.6,494.2 -246.6,453.2 -251.5,453.2
-251.5,446.7 -264.6,446.7 "/>
</g>
<rect x="-250" y="509.6" class="st4" width="8.6" height="14.4"/>
<rect x="-234.2" y="495.2" class="st5" width="8.6" height="28.8"/>
<rect x="-218.3" y="480.8" class="st6" width="8.6" height="43.2"/>
<rect x="-202.5" y="466.4" class="st5" width="8.6" height="57.6"/>
<rect x="-186.6" y="452" class="st5" width="8.6" height="72"/>
</svg>
<?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="svg3852" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:cc="http://creativecommons.org/ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" sodipodi:docname="gps.svg" inkscape:version="0.91 r13725"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-250 452 72 72"
style="enable-background:new -250 452 72 72;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;}
.st2{fill:none;stroke:#EB008B;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st3{display:inline;fill:none;stroke:#224A80;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st4{fill:#FFFFFF;}
.st5{opacity:0.6;fill:#FFFFFF;}
.st6{opacity:0.5;fill:#FFFFFF;}
</style>
<title id="title4758">GPS</title>
<sodipodi:namedview inkscape:cy="55" bordercolor="#666666" showgrid="false" borderopacity="1" objecttolerance="10" guidetolerance="10" inkscape:cx="55" inkscape:zoom="11.136364" gridtolerance="10" pagecolor="#808080" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-height="480" inkscape:current-layer="svg3852" inkscape:window-width="640" id="namedview3929">
</sodipodi:namedview>
<g id="Layer_2" class="st0">
</g>
<g id="ex_thick" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_3" class="st0">
</g>
<g id="ex_thin" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy" class="st0">
</g>
<g id="em_thick" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_4" class="st0">
<g id="g3861" class="st1">
<rect id="rect3863" x="-286.1" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3865" class="st2" cx="-258" cy="348.8" r="28.2"/>
</g>
<g id="g3867" class="st1">
<rect id="rect3869" x="-221.7" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3871" class="st2" cx="-193.5" cy="348.8" r="28.2"/>
</g>
<g id="g3873" class="st1">
<rect id="rect3875" x="-158.5" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3877" class="st2" cx="-130.3" cy="348.8" r="28.2"/>
</g>
</g>
<g id="Layer_2_copy_2" class="st0">
<g id="g3905" class="st1">
<rect id="rect3907" x="-286.1" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3909" class="st2" cx="-258" cy="453.5" r="28.2"/>
</g>
<g id="g3911" class="st1">
<rect id="rect3913" x="-221.7" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3915" class="st2" cx="-193.5" cy="453.5" r="28.2"/>
</g>
<g id="g3917" class="st1">
<rect id="rect3919" x="-158.5" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3921" class="st2" cx="-130.3" cy="453.5" r="28.2"/>
</g>
</g>
<g id="hornet" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_5" class="st0">
</g>
<g id="hornet_THIN" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_6" class="st0">
<polygon id="polygon3927" class="st3" points="-264.6,453.2 -269.5,453.2 -269.5,494.2 -246.6,494.2 -246.6,453.2 -251.5,453.2
-251.5,446.7 -264.6,446.7 "/>
</g>
<rect x="-250" y="509.6" class="st4" width="8.6" height="14.4"/>
<rect x="-234.2" y="495.2" class="st4" width="8.6" height="28.8"/>
<rect x="-218.3" y="480.8" class="st5" width="8.6" height="43.2"/>
<rect x="-202.5" y="466.4" class="st6" width="8.6" height="57.6"/>
<rect x="-186.6" y="452" class="st6" width="8.6" height="72"/>
</svg>
<?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="svg3852" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:cc="http://creativecommons.org/ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" sodipodi:docname="gps.svg" inkscape:version="0.91 r13725"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-250 452 72 72"
style="enable-background:new -250 452 72 72;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;}
.st2{fill:none;stroke:#EB008B;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st3{display:inline;fill:none;stroke:#224A80;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st4{fill:#FFFFFF;}
.st5{opacity:0.5;fill:#FFFFFF;}
</style>
<title id="title4758">GPS</title>
<sodipodi:namedview inkscape:cy="55" bordercolor="#666666" showgrid="false" borderopacity="1" objecttolerance="10" guidetolerance="10" inkscape:cx="55" inkscape:zoom="11.136364" gridtolerance="10" pagecolor="#808080" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-height="480" inkscape:current-layer="svg3852" inkscape:window-width="640" id="namedview3929">
</sodipodi:namedview>
<g id="Layer_2" class="st0">
</g>
<g id="ex_thick" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_3" class="st0">
</g>
<g id="ex_thin" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy" class="st0">
</g>
<g id="em_thick" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_4" class="st0">
<g id="g3861" class="st1">
<rect id="rect3863" x="-286.1" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3865" class="st2" cx="-258" cy="348.8" r="28.2"/>
</g>
<g id="g3867" class="st1">
<rect id="rect3869" x="-221.7" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3871" class="st2" cx="-193.5" cy="348.8" r="28.2"/>
</g>
<g id="g3873" class="st1">
<rect id="rect3875" x="-158.5" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3877" class="st2" cx="-130.3" cy="348.8" r="28.2"/>
</g>
</g>
<g id="Layer_2_copy_2" class="st0">
<g id="g3905" class="st1">
<rect id="rect3907" x="-286.1" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3909" class="st2" cx="-258" cy="453.5" r="28.2"/>
</g>
<g id="g3911" class="st1">
<rect id="rect3913" x="-221.7" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3915" class="st2" cx="-193.5" cy="453.5" r="28.2"/>
</g>
<g id="g3917" class="st1">
<rect id="rect3919" x="-158.5" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3921" class="st2" cx="-130.3" cy="453.5" r="28.2"/>
</g>
</g>
<g id="hornet" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_5" class="st0">
</g>
<g id="hornet_THIN" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_6" class="st0">
<polygon id="polygon3927" class="st3" points="-264.6,453.2 -269.5,453.2 -269.5,494.2 -246.6,494.2 -246.6,453.2 -251.5,453.2
-251.5,446.7 -264.6,446.7 "/>
</g>
<rect x="-250" y="509.6" class="st4" width="8.6" height="14.4"/>
<rect x="-234.2" y="495.2" class="st4" width="8.6" height="28.8"/>
<rect x="-218.3" y="480.8" class="st4" width="8.6" height="43.2"/>
<rect x="-202.5" y="466.4" class="st5" width="8.6" height="57.6"/>
<rect x="-186.6" y="452" class="st5" width="8.6" height="72"/>
</svg>
<?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="svg3852" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:cc="http://creativecommons.org/ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" sodipodi:docname="gps.svg" inkscape:version="0.91 r13725"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-250 452 72 72"
style="enable-background:new -250 452 72 72;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;}
.st2{fill:none;stroke:#EB008B;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st3{display:inline;fill:none;stroke:#224A80;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st4{fill:#FFFFFF;}
.st5{opacity:0.5;fill:#FFFFFF;}
</style>
<title id="title4758">GPS</title>
<sodipodi:namedview inkscape:cy="55" bordercolor="#666666" showgrid="false" borderopacity="1" objecttolerance="10" guidetolerance="10" inkscape:cx="55" inkscape:zoom="11.136364" gridtolerance="10" pagecolor="#808080" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-height="480" inkscape:current-layer="svg3852" inkscape:window-width="640" id="namedview3929">
</sodipodi:namedview>
<g id="Layer_2" class="st0">
</g>
<g id="ex_thick" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_3" class="st0">
</g>
<g id="ex_thin" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy" class="st0">
</g>
<g id="em_thick" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_4" class="st0">
<g id="g3861" class="st1">
<rect id="rect3863" x="-286.1" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3865" class="st2" cx="-258" cy="348.8" r="28.2"/>
</g>
<g id="g3867" class="st1">
<rect id="rect3869" x="-221.7" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3871" class="st2" cx="-193.5" cy="348.8" r="28.2"/>
</g>
<g id="g3873" class="st1">
<rect id="rect3875" x="-158.5" y="320.7" class="st2" width="56.3" height="56.3"/>
<circle id="circle3877" class="st2" cx="-130.3" cy="348.8" r="28.2"/>
</g>
</g>
<g id="Layer_2_copy_2" class="st0">
<g id="g3905" class="st1">
<rect id="rect3907" x="-286.1" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3909" class="st2" cx="-258" cy="453.5" r="28.2"/>
</g>
<g id="g3911" class="st1">
<rect id="rect3913" x="-221.7" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3915" class="st2" cx="-193.5" cy="453.5" r="28.2"/>
</g>
<g id="g3917" class="st1">
<rect id="rect3919" x="-158.5" y="425.3" class="st2" width="56.3" height="56.3"/>
<circle id="circle3921" class="st2" cx="-130.3" cy="453.5" r="28.2"/>
</g>
</g>
<g id="hornet" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_2_copy_5" class="st0">
</g>
<g id="hornet_THIN" transform="matrix(-1,0,0,-1,111.82126,108.29692)">
</g>
<g id="Layer_6" class="st0">
<polygon id="polygon3927" class="st3" points="-264.6,453.2 -269.5,453.2 -269.5,494.2 -246.6,494.2 -246.6,453.2 -251.5,453.2
-251.5,446.7 -264.6,446.7 "/>
</g>
<rect x="-250" y="509.6" class="st4" width="8.6" height="14.4"/>
<rect x="-234.2" y="495.2" class="st4" width="8.6" height="28.8"/>
<rect x="-218.3" y="480.8" class="st4" width="8.6" height="43.2"/>
<rect x="-202.5" y="466.4" class="st4" width="8.6" height="57.6"/>
<rect x="-186.6" y="452" class="st5" width="8.6" height="72"/>
</svg>
<?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_3" xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="8 672 72 72"
style="enable-background:new 8 672 72 72;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;stroke:#DE2F26;stroke-width:6;stroke-miterlimit:10;}
.st1{fill:#FFFFFF;}
</style>
<path id="path2231" class="st0" d="M76,732.5l-29.8-51.6c-0.5-0.8-1.3-1.3-2.3-1.3c-0.9,0-1.8,0.5-2.3,1.3L12,732.5
c-0.5,0.8-0.5,1.8,0,2.6c0.5,0.8,1.3,1.3,2.3,1.3h59.6c0.9,0,1.8-0.5,2.3-1.3C76.5,734.3,76.5,733.3,76,732.5z"/>
<polygon id="polygon2233" class="st1" points="20.6,730.1 67.4,730.1 44,689.5 "/>
<path id="path2235" d="M41.6,715.3c0.1,1.2,0.3,2.1,0.6,2.7c0.3,0.6,0.8,0.9,1.6,0.9c0,0,0.2,0,0.2,0c0.8,0,1.3-0.3,1.6-0.9
c0.3-0.6,0.5-1.5,0.6-2.7l0.7-9.5c0.1-1.8,0.2-3.2,0.2-4c0-1.1-0.3-1.9-0.9-2.6c-0.6-0.6-1.4-0.9-2.3-0.9c-0.9,0-1.7,0.3-2.3,0.9
c-0.6,0.6-0.9,1.5-0.9,2.6c0,0.8,0.1,2.1,0.2,4L41.6,715.3z"/>
<circle id="circle2237" cx="44" cy="724.6" r="3.3"/>
</svg>
...@@ -27,7 +27,7 @@ This file is part of the QGROUNDCONTROL project ...@@ -27,7 +27,7 @@ This file is part of the QGROUNDCONTROL project
* @author Gus Grubba <mavlink@grubba.com> * @author Gus Grubba <mavlink@grubba.com>
*/ */
import QtQuick 2.3 import QtQuick 2.5
import QtQuick.Controls 1.2 import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.2 import QtQuick.Controls.Styles 1.2
...@@ -39,275 +39,232 @@ import QGroundControl.ScreenTools 1.0 ...@@ -39,275 +39,232 @@ import QGroundControl.ScreenTools 1.0
import QGroundControl.Controllers 1.0 import QGroundControl.Controllers 1.0
Rectangle { Rectangle {
id: toolBarHolder id: toolBar
anchors.left: parent.left color: isBackgroundDark ? Qt.rgba(0,0,0,0.75) : Qt.rgba(0,0,0,0.5)
anchors.right: parent.right
height: toolBarHeight
color: qgcPal.window
QGCPalette { id: qgcPal; colorGroupEnabled: true } QGCPalette { id: qgcPal; colorGroupEnabled: true }
property var activeVehicle: multiVehicleManager.activeVehicle property var activeVehicle: multiVehicleManager.activeVehicle
property bool isMessageImportant: activeVehicle ? !activeVehicle.messageTypeNormal && !activeVehicle.messageTypeNone : false
property bool isBackgroundDark: true
readonly property real toolBarHeight: ScreenTools.defaultFontPixelHeight * 3 /*
property int cellSpacerSize: ScreenTools.isMobile ? getProportionalDimmension(6) : getProportionalDimmension(4) Dev System (Mac OS)
readonly property int cellHeight: toolBarHeight * 0.75
qml: Main Window Width: 1008
qml: Toolbar height: 51.2
qml: Default font: 12.8
qml: Font (.75): 9.600000000000001
qml: Font (.85): 10.88
qml: Font 1.5): 19.200000000000003
qml: Default Font Width: 8.328125
qml: Default Font Height: 12.8
qml: --
qml: Real Font Height: 16
qml: fontHRatio: 1
qml: --
qml: cellHeight: 38
qml: tbFontSmall: 10
qml: tbFontNormal: 12
qml: tbFontLarge: 18
qml: tbSpacing: 9.54
Nexus 9
qml: Main Window Width: 2048
qml: Toolbar height: 90.9312
qml: Default font: 38
qml: Font (.75): 28.5
qml: Font (.85): 32.3
qml: Font 1.5): 57
qml: Default Font Width: 20.0625
qml: Default Font Height: 38
qml: --
qml: Real Font Height: 38
qml: fontHRatio: 2.375
qml: --
qml: cellHeight: 68
qml: tbFontSmall: 23.75
qml: tbFontNormal: 28.5
qml: tbFontLarge: 42.75
qml: tbSpacing: 16.87552
Nexus 7
qml: Main Window Width: 1920
qml: Toolbar height: 85.248
qml: Default font: 38
qml: Font (.75): 28.5
qml: Font (.85): 32.3
qml: Font 1.5): 57
qml: Default Font Width: 20.140625
qml: Default Font Height: 38
qml: --
qml: Real Font Height: 38
qml: fontHRatio: 2.375
qml: --
qml: cellHeight: 63
qml: tbFontSmall: 23.75
qml: tbFontNormal: 28.5
qml: tbFontLarge: 42.75
qml: tbSpacing: 15.820800000000002
Nexus 4
qml: Main Window Width: 1196
qml: Toolbar height: 79.65360000000001
qml: Default font: 38
qml: Font (.75): 28.5
qml: Font (.85): 32.3
qml: Font 1.5): 57
qml: Default Font Width: 20.140625
qml: Default Font Height: 38
qml: --
qml: Real Font Height: 38
qml: fontHRatio: 2.375
qml: --
qml: cellHeight: 59
qml: tbFontSmall: 23.75
qml: tbFontNormal: 28.5
qml: tbFontLarge: 42.75
qml: tbSpacing: 9.85504
*/
readonly property int cellHeight: height * 0.75
readonly property real horizontalMargins: ScreenTools.defaultFontPixelWidth / 2 readonly property real tbFontSmall: 10 * ScreenTools.fontHRatio
readonly property real verticalMargins: ScreenTools.defaultFontPixelHeight / 4 readonly property real tbFontNormal: 12 * ScreenTools.fontHRatio
readonly property real tbFontLarge: 18 * ScreenTools.fontHRatio
readonly property var colorBlue: "#1a6eaa" readonly property real tbSpacing: ScreenTools.isMobile ? toolBar.width * 0.00824 : 9.54
readonly property var colorGreen: "#329147"
readonly property var colorRed: "#942324"
readonly property var colorOrange: "#a76f26"
readonly property var colorWhite: "#f0f0f0"
property var colorOrangeText: (qgcPal.globalTheme === QGCPalette.Light) ? "#b75711" : "#ea8225" readonly property var colorGreen: "#05f068"
property var colorRedText: (qgcPal.globalTheme === QGCPalette.Light) ? "#ee1112" : "#ef2526" readonly property var colorOrange: "#f0ab06"
property var colorGreenText: (qgcPal.globalTheme === QGCPalette.Light) ? "#046b1b" : "#00d930" readonly property var colorRed: "#fc4638"
property var colorWhiteText: (qgcPal.globalTheme === QGCPalette.Light) ? "#343333" : "#f0f0f0" readonly property var colorGrey: "#7f7f7f"
readonly property var colorBlue: "#636efe"
readonly property var colorWhite: "#ffffff"
MainToolBarController { id: _controller } MainToolBarController { id: _controller }
function showToolbarMessage(message) { function showToolbarMessage(message) {
toolBarMessage.text = message toolBarMessage.text = message
if (toolBarMessage.contentHeight > toolBarMessageCloseButton.height) {
toolBarHolder.height = toolBarHeight + toolBarMessage.contentHeight + (verticalMargins * 2)
} else {
toolBarHolder.height = toolBarHeight + toolBarMessageCloseButton.height + (verticalMargins * 2)
}
toolBarMessageArea.visible = true toolBarMessageArea.visible = true
} }
function getProportionalDimmension(val) {
return toolBarHeight * val / 40
}
function getMessageColor() {
if (activeVehicle.messageTypeNone)
return qgcPal.button;
if (activeVehicle.messageTypeNorma)
return colorBlue;
if (activeVehicle.messageTypeWarning)
return colorOrange;
if (activeVehicle.messageTypeError)
return colorRed;
// Cannot be so make make it obnoxious to show error
return "purple";
}
function getMessageIcon() {
if (activeVehicle.messageTypeNormal || activeVehicle.messageTypeNone)
return "qrc:/res/Megaphone";
else
return "qrc:/res/Yield";
}
function getBatteryIcon() {
if(activeVehicle.batteryPercent < 20.0)
return "qrc:/res/Battery_0";
else if(activeVehicle.batteryPercent < 40.0)
return "qrc:/res/Battery_20";
else if(activeVehicle.batteryPercent < 60.0)
return "qrc:/res/Battery_40";
else if(activeVehicle.batteryPercent < 80.0)
return "qrc:/res/Battery_60";
else if(activeVehicle.batteryPercent < 90.0)
return "qrc:/res/Battery_80";
else
return "qrc:/res/Battery_100";
}
function getBatteryColor() {
if (activeVehicle.batteryPercent > 40.0)
return colorGreen;
if(activeVehicle.batteryPercent > 0.01)
return colorRed;
// This means there is no battery level data
return colorBlue;
}
function getSatelliteColor() {
// No GPS data
if (activeVehicle.satelliteCount < 0)
return qgcPal.button
// No Lock
if(activeVehicle.satelliteLock < 2)
return colorRed;
// 2D Lock
if(activeVehicle.satelliteLock === 2)
return colorBlue;
// Lock is 3D or more
return colorGreen;
}
function getRSSIColor(value) {
if(value < 10)
return colorRed;
if(value < 50)
return colorOrange;
return colorGreen;
}
function showMavStatus() { function showMavStatus() {
return (multiVehicleManager.activeVehicleAvailable && activeVehicle.heartbeatTimeout === 0 && _controller.connectionCount > 0); return (multiVehicleManager.activeVehicleAvailable && activeVehicle.heartbeatTimeout === 0 && _controller.connectionCount > 0);
} }
//------------------------------------------------------------------------- Component.onCompleted: {
//-- Main menu for Mobile Devices //-- TODO: Get this from the actual state
Menu { flyButton.checked = true
id: mobileMenu }
ExclusiveGroup { id: mainMenuGroup }
MenuItem {
id: flyViewShowing
text: "Fly"
checkable: true
checked: true
exclusiveGroup: mainMenuGroup
onTriggered: {
checked = true
_controller.onFlyView();
}
}
MenuItem { Connections {
id: setupViewShowing target: controller
text: "Setup" onShowFlyView: { flyButton.checked = true }
checkable: true onShowPlanView: { planButton.checked = true }
exclusiveGroup: mainMenuGroup onShowSetupView:{ setupButton.checked = true }
}
onTriggered: { Row {
checked = true id: viewRow
height: cellHeight
spacing: tbSpacing
anchors.left: parent.left
anchors.leftMargin: tbSpacing
anchors.verticalCenter: parent.verticalCenter
ExclusiveGroup { id: mainActionGroup }
QGCToolBarButton {
id: setupButton
width: cellHeight * 1.3
height: cellHeight
exclusiveGroup: mainActionGroup
source: "qrc:/res/Gears"
onClicked: {
_controller.onSetupView(); _controller.onSetupView();
} }
} }
MenuItem { Rectangle {
id: planViewShowing height: cellHeight
text: "Plan" width: 1
checkable: true color: Qt.rgba(1,1,1,0.45)
exclusiveGroup: mainMenuGroup }
onTriggered: { QGCToolBarButton {
checked = true id: planButton
width: cellHeight * 1.3
height: cellHeight
exclusiveGroup: mainActionGroup
source: "qrc:/res/Plan"
onClicked: {
_controller.onPlanView(); _controller.onPlanView();
} }
} }
MenuSeparator { } Rectangle {
height: cellHeight
width: 1
MenuItem { color: Qt.rgba(1,1,1,0.45)
text: "QGroundControl Settings"
onTriggered: controller.showSettings()
} }
} // Menu
/* QGCToolBarButton {
Row { id: flyButton
id: toolRow width: cellHeight * 1.3
height: cellHeight height: cellHeight
spacing: getProportionalDimmension(4) exclusiveGroup: mainActionGroup
} source: "qrc:/res/PaperPlane"
*/ onClicked: {
_controller.onFlyView();
Loader {
id: desktopToolsLoader
height: cellHeight
x: horizontalMargins
y: (toolBarHeight - cellHeight) / 2
sourceComponent: ScreenTools.isMobile ? undefined : desktopTools
}
//---------------------------------------------------------------------
//-- Indicators
Row {
id: row12
x: horizontalMargins + (ScreenTools.isMobile ? 0: desktopToolsLoader.item.width)
height: cellHeight
spacing: cellSpacerSize
anchors.top: desktopToolsLoader.top
anchors.verticalCenter: desktopToolsLoader.verticalCenter
//-- "Hamburger" menu for Mobile Devices
Item {
id: actionButton
visible: ScreenTools.isMobile
height: cellHeight
width: cellHeight
Image {
id: buttomImg
anchors.fill: parent
source: "/qmlimages/buttonMore.svg"
mipmap: true
smooth: true
antialiasing: true
fillMode: Image.PreserveAspectFit
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton
onClicked: {
if (mouse.button == Qt.LeftButton)
{
mobileMenu.popup();
}
}
} }
} }
//-- Separator if Hamburger menu is visible
Rectangle { Rectangle {
visible: actionButton.visible height: cellHeight
height: cellHeight width: 1
width: cellHeight color: Qt.rgba(1,1,1,0.45)
color: "#00000000"
anchors.verticalCenter: parent.verticalCenter
} }
Loader { }
id: activeVehicleLoader
visible: showMavStatus()
source: multiVehicleManager.activeVehicleAvailable ? "MainToolBarActiveVehicleComponent.qml" : ""
property real cellHeight: toolBarHolder.cellHeight Item {
property real cellSpacerSize: toolBarHolder.cellSpacerSize visible: showMavStatus() && !connectionStatus.visible
height: cellHeight
width: (toolBar.width - viewRow.width - connectRow.width)
anchors.left: viewRow.right
anchors.leftMargin: tbSpacing * 2
anchors.verticalCenter: parent.verticalCenter
Loader {
source: multiVehicleManager.activeVehicleAvailable ? "MainToolBarIndicators.qml" : ""
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
} }
}
Rectangle { QGCLabel {
id: connectionStatus id: connectionStatus
width: getProportionalDimmension(160) visible: (_controller.connectionCount > 0 && multiVehicleManager.activeVehicleAvailable && activeVehicle.heartbeatTimeout != 0)
height: cellHeight text: "CONNECTION LOST"
visible: (_controller.connectionCount > 0 && multiVehicleManager.activeVehicleAvailable && activeVehicle.heartbeatTimeout != 0) font.pixelSize: tbFontLarge
anchors.verticalCenter: parent.verticalCenter font.weight: Font.DemiBold
color: "#00000000" color: colorRed
border.color: "#00000000" anchors.left: viewRow.right
border.width: 0 anchors.leftMargin: tbSpacing * 2
anchors.verticalCenter: parent.verticalCenter
QGCLabel { }
id: connectionStatusText
text: qsTr("CONNECTION LOST")
font.pixelSize: ScreenTools.defaultFontPixelSize
font.weight: Font.DemiBold
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
color: colorRedText
}
}
} // Row
Row { Row {
id: connectRow id: connectRow
anchors.rightMargin: verticalMargins height: cellHeight
spacing: tbSpacing
anchors.rightMargin: tbSpacing
anchors.right: parent.right anchors.right: parent.right
anchors.top: desktopToolsLoader.top anchors.verticalCenter: parent.verticalCenter
anchors.verticalCenter: desktopToolsLoader.verticalCenter
height: desktopToolsLoader.height
spacing: cellSpacerSize
Menu { Menu {
id: connectMenu id: connectMenu
...@@ -336,20 +293,53 @@ Rectangle { ...@@ -336,20 +293,53 @@ Rectangle {
} }
} }
QGCButton { Rectangle {
id: connectButton height: cellHeight
width: getProportionalDimmension(100) width: 1
visible: _controller.connectionCount === 0 color: Qt.rgba(1,1,1,0.45)
text: qsTr("Connect")
menu: connectMenu
} }
QGCButton { QGCToolBarButton {
id: disconnectButton id: connectButton
width: getProportionalDimmension(100) width: cellHeight * 1.3
visible: _controller.connectionCount === 1 height: cellHeight
text: qsTr("Disconnect") visible: _controller.connectionCount === 0
source: "/qmlimages/Connect.svg"
checked: false
onClicked: {
checked = false
connectMenu.popup()
/*
console.log("Main Window Width: " + mainWindow.width)
console.log("Toolbar height: " + toolBar.height)
console.log("Default font: " + ScreenTools.defaultFontPixelSize)
console.log("Font (.75): " + ScreenTools.defaultFontPixelSize * 0.75)
console.log("Font (.85): " + ScreenTools.defaultFontPixelSize * 0.85)
console.log("Font 1.5): " + ScreenTools.defaultFontPixelSize * 1.5)
console.log("Default Font Width: " + ScreenTools.defaultFontPixelWidth)
console.log("Default Font Height: " + ScreenTools.defaultFontPixelHeight)
console.log("--")
console.log("Real Font Height: " + ScreenTools.realFontHeight)
console.log("fontHRatio: " + ScreenTools.fontHRatio)
console.log("--")
console.log("cellHeight: " + cellHeight)
console.log("tbFontSmall: " + tbFontSmall);
console.log("tbFontNormal: " + tbFontNormal);
console.log("tbFontLarge: " + tbFontLarge);
console.log("tbSpacing: " + tbSpacing);
*/
}
}
QGCToolBarButton {
id: disconnectButton
width: cellHeight * 1.3
height: cellHeight
visible: _controller.connectionCount === 1
source: "/qmlimages/Disconnect.svg"
checked: false
onClicked: { onClicked: {
checked = false
_controller.onDisconnect(""); _controller.onDisconnect("");
} }
} }
...@@ -372,131 +362,63 @@ Rectangle { ...@@ -372,131 +362,63 @@ Rectangle {
} }
} }
QGCButton { QGCToolBarButton {
id: multidisconnectButton id: multidisconnectButton
width: getProportionalDimmension(100) width: cellHeight * 1.3
text: "Disconnect" height: cellHeight
visible: _controller.connectionCount > 1 visible: _controller.connectionCount > 1
menu: disconnectMenu source: "/qmlimages/Disconnect.svg"
checked: false
onClicked: {
checked = false
disconnectMenu.popup()
}
} }
} // Row
}
// Progress bar // Progress bar
Rectangle { Rectangle {
id: progressBar id: progressBar
anchors.top: desktopToolsLoader.bottom anchors.bottom: parent.bottom
height: getProportionalDimmension(3) height: toolBar.height * 0.05
width: parent.width * _controller.progressBarValue width: parent.width * _controller.progressBarValue
color: qgcPal.text color: colorGreen
} }
// Toolbar message area // Toolbar message area
Rectangle { Rectangle {
id: toolBarMessageArea id: toolBarMessageArea
anchors.leftMargin: horizontalMargins x: toolBar.parent.width * 0.225
anchors.rightMargin: horizontalMargins y: toolBar.parent.height - (ScreenTools.defaultFontPixelHeight * ScreenTools.fontHRatio * 6)
anchors.topMargin: verticalMargins width: toolBar.parent.width * 0.55
anchors.bottomMargin: verticalMargins height: ScreenTools.defaultFontPixelHeight * ScreenTools.fontHRatio * 6
anchors.top: progressBar.bottom color: Qt.rgba(0,0,0,0.65)
anchors.bottom: parent.bottom visible: false
anchors.left: parent.left
anchors.right: parent.right
color: qgcPal.windowShadeDark
visible: false
QGCLabel { QGCLabel {
id: toolBarMessage id: toolBarMessage
anchors.fill: parent width: toolBarMessageArea.width - toolBarMessageCloseButton.width
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
color: qgcPal.warningText color: qgcPal.warningText
lineHeightMode: Text.ProportionalHeight
lineHeight: 1.25
anchors.left: parent.left
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.margins: tbSpacing
} }
QGCButton { QGCButton {
id: toolBarMessageCloseButton id: toolBarMessageCloseButton
anchors.rightMargin: horizontalMargins primary: true
anchors.top: parent.top text: "Close Message"
anchors.right: parent.right anchors.right: parent.right
primary: true anchors.bottom: parent.bottom
text: "Close Message" anchors.margins: tbSpacing
onClicked: { onClicked: {
parent.visible = false toolBarMessageArea.visible = false
toolBarHolder.height = toolBarHeight
_controller.onToolBarMessageClosed() _controller.onToolBarMessageClosed()
} }
} }
} }
Component {
id: desktopTools
//---------------------------------------------------------------------
//-- Main menu for Non Mobile Devices (Chevron Buttons)
Row {
id: row11
height: cellHeight
spacing: -getProportionalDimmension(12)
Connections {
target: ScreenTools
onRepaintRequested: {
setupButton.repaintChevron = true;
planButton.repaintChevron = true;
flyButton.repaintChevron = true;
}
}
Connections {
target:controller
onShowFlyView: { flyButton.checked = true }
onShowPlanView: { planButton.checked = true }
onShowSetupView:{ setupButton.checked = true }
}
ExclusiveGroup { id: mainActionGroup }
QGCToolBarButton {
id: setupButton
width: getProportionalDimmension(90)
height: cellHeight
exclusiveGroup: mainActionGroup
text: "Setup"
onClicked: {
checked = true
_controller.onSetupView();
}
z: 1000
}
QGCToolBarButton {
id: planButton
width: getProportionalDimmension(90)
height: cellHeight
exclusiveGroup: mainActionGroup
text: "Plan"
onClicked: {
checked = true
_controller.onPlanView();
}
z: 900
}
QGCToolBarButton {
id: flyButton
width: getProportionalDimmension(90)
height: cellHeight
exclusiveGroup: mainActionGroup
text: "Fly"
checked: true
onClicked: {
checked = true
_controller.onFlyView();
}
z: 800
}
} // Row
} // Component - desktopTools
} // Rectangle } // Rectangle
...@@ -21,94 +21,273 @@ This file is part of the QGROUNDCONTROL project ...@@ -21,94 +21,273 @@ This file is part of the QGROUNDCONTROL project
======================================================================*/ ======================================================================*/
import QtQuick 2.3 import QtQuick 2.5
import QtQuick.Controls 1.2 import QtQuick.Controls 1.2
import QtGraphicalEffects 1.0
import QtQuick.Controls.Styles 1.2 import QtQuick.Controls.Styles 1.2
import QGroundControl 1.0
import QGroundControl.Controls 1.0 import QGroundControl.Controls 1.0
import QGroundControl.ScreenTools 1.0 import QGroundControl.ScreenTools 1.0
Row { Row {
height: cellHeight spacing: tbSpacing * 2
spacing: cellSpacerSize
function getSatStrength(count) {
if (count < 1)
return 0
if (count < 4)
return 20
if (count < 6)
return 40
if (count < 8)
return 60
if (count < 10)
return 80
return 100
}
Rectangle { function getMessageColor() {
id: messages if (activeVehicle.messageTypeNone)
width: (activeVehicle.messageCount > 99) ? getProportionalDimmension(65) : getProportionalDimmension(60) return colorGrey
height: cellHeight if (activeVehicle.messageTypeNormal)
anchors.verticalCenter: parent.verticalCenter return colorBlue;
color: getMessageColor() if (activeVehicle.messageTypeWarning)
border.color: "#00000000" return colorOrange;
border.width: 0 if (activeVehicle.messageTypeError)
property bool showTriangle: false return colorRed;
// Cannot be so make make it obnoxious to show error
console.log("Invalid vehicle message type")
return "purple";
}
Image { function getBatteryVoltageText() {
id: messageIcon if (activeVehicle.batteryVoltage > 0) {
source: getMessageIcon(); //-- TODO: Need number of cells so I can show cell voltage instead of total voltage
height: getProportionalDimmension(16) //if (battNumCells && battNumCells.value) {
fillMode: Image.PreserveAspectFit // return (activeVehicle.batteryVoltage / battNumCells.value).toFixed(2) + 'V'
anchors.verticalCenter: parent.verticalCenter //} else {
anchors.left: parent.left return activeVehicle.batteryVoltage.toFixed(1) + 'V'
anchors.leftMargin: getProportionalDimmension(8) //}
}
return 'N/A';
}
function getBatteryPercentageText() {
if(activeVehicle.batteryPercent > 98.9) {
return "100%"
} }
if(activeVehicle.batteryPercent > 0.1) {
return activeVehicle.batteryPercent.toFixed(0) + "%"
}
return "N/A"
}
function getBatteryColor() {
if(activeVehicle.batteryPercent > 75) {
return colorGreen
}
if(activeVehicle.batteryPercent > 50) {
return colorOrange
}
if(activeVehicle.batteryPercent > 0.1) {
return colorRed
}
return colorGrey
}
//-------------------------------------------------------------------------
//-- Message Indicator
Item {
id: messages
width: cellHeight
height: cellHeight
visible: activeVehicle.messageCount
anchors.verticalCenter: parent.verticalCenter
Item { Item {
id: messageTextRect id: criticalMessage
anchors.verticalCenter: parent.verticalCenter anchors.fill: parent
anchors.right: parent.right visible: activeVehicle.messageCount > 0 && isMessageImportant
width: messages.width - messageIcon.width Image {
QGCLabel { source: "/qmlimages/Yield.svg"
id: messageText height: cellHeight * 0.75
text: (activeVehicle.messageCount > 0) ? activeVehicle.messageCount : '' fillMode: Image.PreserveAspectFit
font.pixelSize: ScreenTools.smallFontPixelSize mipmap: true
font.weight: Font.DemiBold smooth: true
anchors.verticalCenter: parent.verticalCenter cache: false
visible: isMessageImportant
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
horizontalAlignment: Text.AlignHCenter }
color: colorWhite SequentialAnimation {
id: loopAnimation
loops: Animation.Infinite
NumberAnimation { target: criticalMessage; property: "opacity"; duration: 1000; from: 0.25; to: 1 }
NumberAnimation { target: criticalMessage; property: "opacity"; duration: 1000; from: 1; to: 0.25 }
}
onVisibleChanged: {
if(messages.visible) {
loopAnimation.start()
} else {
loopAnimation.stop()
}
} }
} }
Image { Item {
id: dropDown anchors.fill: parent
source: "/qmlimages/arrow-down.png" visible: !criticalMessage.visible
visible: (messages.showTriangle) && (activeVehicle.messageCount > 0) Image {
anchors.bottom: parent.bottom id: messageIcon
anchors.right: parent.right source: "/qmlimages/Megaphone.svg"
anchors.bottomMargin: getProportionalDimmension(3) height: cellHeight * 0.5
anchors.rightMargin: getProportionalDimmension(3) fillMode: Image.PreserveAspectFit
} mipmap: true
smooth: true
Timer { visible: false
id: mouseOffTimer anchors.verticalCenter: parent.verticalCenter
interval: 2000; anchors.horizontalCenter: parent.horizontalCenter
running: false; }
repeat: false ColorOverlay {
onTriggered: { anchors.fill: messageIcon
messages.showTriangle = false; source: messageIcon
color: getMessageColor()
} }
} }
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
hoverEnabled: true
onEntered: {
messages.showTriangle = true;
mouseOffTimer.start();
}
onClicked: { onClicked: {
var p = mapToItem(toolBarHolder, mouseX, mouseY); var p = mapToItem(toolBar, mouseX, mouseY);
_controller.onEnterMessageArea(p.x, p.y); _controller.onEnterMessageArea(p.x, p.y);
} }
} }
}
//-------------------------------------------------------------------------
//-- GPS Indicator
Item {
id: satelitte
width: gpsRow.width * 1.1
height: cellHeight
Row {
id: gpsRow
height: parent.height
Image {
id: gpsIcon
source: "/qmlimages/Gps.svg"
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
width: cellHeight * 0.65
height: cellHeight * 0.5
opacity: activeVehicle.satelliteCount < 1 ? 0.5 : 1
anchors.verticalCenter: parent.verticalCenter
}
SignalStrength {
size: cellHeight * 0.5
percent: getSatStrength(activeVehicle.satelliteCount)
anchors.verticalCenter: parent.verticalCenter
}
}
QGCLabel {
text: activeVehicle.satelliteCount
font.pixelSize: tbFontSmall
color: colorWhite
opacity: activeVehicle.satelliteCount < 1 ? 0.5 : 1
anchors.top: parent.top
anchors.leftMargin: gpsIcon.width
anchors.left: parent.left
}
}
//-------------------------------------------------------------------------
//-- RC RSSI
Item {
id: rcRssi
width: rssiRow.width * 1.1
height: cellHeight
Row {
id: rssiRow
height: parent.height
Image {
source: "/qmlimages/RC.svg"
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
width: cellHeight * 0.65
height: cellHeight * 0.5
opacity: _controller.remoteRSSI < 1 ? 0.5 : 1
anchors.verticalCenter: parent.verticalCenter
}
SignalStrength {
size: cellHeight * 0.5
percent: _controller.remoteRSSI
anchors.verticalCenter: parent.verticalCenter
}
}
}
//-------------------------------------------------------------------------
//-- Battery Indicator
Item {
id: batteryStatus
width: battRow.width * 1.1
height: cellHeight
opacity: (activeVehicle.batteryVoltage > 0) ? 1 : 0.5
Row {
id: battRow
height: cellHeight
spacing: tbSpacing
anchors.horizontalCenter: parent.horizontalCenter
Column {
spacing: tbSpacing * 0.5
anchors.verticalCenter: parent.verticalCenter
Image {
id: batIcon
source: "/qmlimages/Battery.svg"
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
height: batPercent.height * 0.85
anchors.horizontalCenter: parent.horizontalCenter
}
QGCLabel {
text: (activeVehicle.batteryConsumed > 0) ? activeVehicle.batteryConsumed.toFixed(0) + 'mAh' : 'N/A';
font.pixelSize: tbFontSmall
color: getBatteryColor()
visible: QGroundControl.isAdvancedMode
anchors.horizontalCenter: parent.horizontalCenter
}
}
Column {
anchors.verticalCenter: parent.verticalCenter
QGCLabel {
id: batPercent
text: getBatteryPercentageText()
font.pixelSize: tbFontLarge
color: getBatteryColor()
anchors.horizontalCenter: parent.horizontalCenter
}
QGCLabel {
text: getBatteryVoltageText()
font.pixelSize: tbFontNormal
color: getBatteryColor()
anchors.horizontalCenter: parent.horizontalCenter
}
}
}
} }
//-------------------------------------------------------------------------
//-- Vehicle Selector
QGCButton { QGCButton {
width: ScreenTools.defaultFontPixelWidth * 13 width: ScreenTools.defaultFontPixelSize * 12
height: cellHeight height: cellHeight * 0.75
text: "Vehicle " + activeVehicle.id
visible: vehicleMenuItems.length > 0
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
text: "Vehicle " + activeVehicle.id
menu: vehicleMenu menu: vehicleMenu
...@@ -133,7 +312,7 @@ Row { ...@@ -133,7 +312,7 @@ Row {
function updateVehicleMenu() { function updateVehicleMenu() {
// Remove old menu items // Remove old menu items
for (var i=0; i<vehicleMenuItems.length; i++) { for (var i = 0; i < vehicleMenuItems.length; i++) {
vehicleMenu.removeItem(vehicleMenuItems[i]) vehicleMenu.removeItem(vehicleMenuItems[i])
} }
vehicleMenuItems.length = 0 vehicleMenuItems.length = 0
...@@ -155,40 +334,132 @@ Row { ...@@ -155,40 +334,132 @@ Row {
} }
} }
//-------------------------------------------------------------------------
//-- Mode Selector
Rectangle { Item {
id: satelitte width: selectorRow.width * 1.1
width: getProportionalDimmension(55)
height: cellHeight height: cellHeight
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
color: getSatelliteColor(); Row {
border.color: "#00000000" id: selectorRow
border.width: 0 spacing: tbSpacing
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
Image {
width: cellHeight * 0.65
height: cellHeight * 0.65
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
source: "/qmlimages/Quad.svg"
anchors.verticalCenter: parent.verticalCenter
}
QGCLabel {
text: activeVehicle.flightMode
font.pixelSize: tbFontLarge
color: colorWhite
anchors.verticalCenter: parent.verticalCenter
}
}
Image { Menu {
source: "qrc:/res/Gps"; id: flightModesMenu
height: getProportionalDimmension(24)
fillMode: Image.PreserveAspectFit
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: getProportionalDimmension(6)
mipmap: true
smooth: true
} }
QGCLabel { Component {
id: satelitteText id: flightModeMenuItemComponent
text: activeVehicle.satelliteCount >= 0 ? activeVehicle.satelliteCount : 'NA'
font.pixelSize: activeVehicle.satelliteCount >= 0 ? ScreenTools.defaultFontPixelSize : ScreenTools.smallFontPixelSize MenuItem {
font.weight: Font.DemiBold checkable: true
checked: activeVehicle.flightMode === text
onTriggered: activeVehicle.flightMode = text
}
}
property var flightModesMenuItems: []
function updateFlightModesMenu() {
if (activeVehicle.flightModeSetAvailable) {
// Remove old menu items
for (var i = 0; i < flightModesMenuItems.length; i++) {
flightModesMenu.removeItem(flightModesMenuItems[i])
}
flightModesMenuItems.length = 0
// Add new items
for (var i = 0; i < activeVehicle.flightModes.length; i++) {
var menuItem = flightModeMenuItemComponent.createObject(null, { "text": activeVehicle.flightModes[i] })
flightModesMenuItems.push(menuItem)
flightModesMenu.insertItem(i, menuItem)
}
}
}
Component.onCompleted: updateFlightModesMenu()
Connections {
target: multiVehicleManager
onActiveVehicleChanged: parent.updateFlightModesMenu
}
MouseArea {
visible: activeVehicle.flightModeSetAvailable
anchors.fill: parent
onClicked: {
flightModesMenu.popup()
}
}
}
//-------------------------------------------------------------------------
//-- Arm/Disarm
Item {
width: armCol.width * 1.1
height: cellHeight
anchors.verticalCenter: parent.verticalCenter
Row {
id: armCol
spacing: tbSpacing * 0.5
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right Image {
anchors.rightMargin: getProportionalDimmension(6) width: cellHeight * 0.5
horizontalAlignment: Text.AlignRight height: cellHeight * 0.5
color: colorWhite fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
source: activeVehicle.armed ? "/qmlimages/Disarmed.svg" : "/qmlimages/Armed.svg"
anchors.verticalCenter: parent.verticalCenter
}
QGCLabel {
text: activeVehicle.armed ? "Armed" : "Disarmed"
font.pixelSize: tbFontLarge
color: colorWhite
anchors.verticalCenter: parent.verticalCenter
}
}
MouseArea {
anchors.fill: parent
onClicked: {
activeVehicle.armed = !activeVehicle.armed
}
} }
} }
/*
property var colorOrangeText: (qgcPal.globalTheme === QGCPalette.Light) ? "#b75711" : "#ea8225"
property var colorRedText: (qgcPal.globalTheme === QGCPalette.Light) ? "#ee1112" : "#ef2526"
property var colorGreenText: (qgcPal.globalTheme === QGCPalette.Light) ? "#046b1b" : "#00d930"
property var colorWhiteText: (qgcPal.globalTheme === QGCPalette.Light) ? "#343333" : "#f0f0f0"
function getRSSIColor(value) {
if(value < 10)
return colorRed;
if(value < 50)
return colorOrange;
return colorGreen;
}
Rectangle { Rectangle {
id: rssiRC id: rssiRC
width: getProportionalDimmension(55) width: getProportionalDimmension(55)
...@@ -280,147 +551,7 @@ Row { ...@@ -280,147 +551,7 @@ Row {
} }
} }
Rectangle {
id: batteryStatus
width: activeVehicle.batteryConsumed < 0.0 ? getProportionalDimmension(60) : getProportionalDimmension(80)
height: cellHeight
anchors.verticalCenter: parent.verticalCenter
color: getBatteryColor();
border.color: "#00000000"
border.width: 0
Image {
source: getBatteryIcon();
height: getProportionalDimmension(20)
fillMode: Image.PreserveAspectFit
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: getProportionalDimmension(6)
mipmap: true
smooth: true
}
QGCLabel {
visible: batteryStatus.visible && activeVehicle.batteryConsumed < 0.0
text: (activeVehicle.batteryVoltage > 0) ? activeVehicle.batteryVoltage.toFixed(1) + 'V' : '---';
font.pixelSize: ScreenTools.smallFontPixelSize
font.weight: Font.DemiBold
anchors.right: parent.right
anchors.rightMargin: getProportionalDimmension(6)
anchors.verticalCenter: parent.verticalCenter
horizontalAlignment: Text.AlignRight
color: colorWhite
}
Column {
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: getProportionalDimmension(6)
visible: batteryStatus.visible && activeVehicle.batteryConsumed >= 0.0
QGCLabel {
text: (activeVehicle.batteryVoltage > 0) ? activeVehicle.batteryVoltage.toFixed(1) + 'V' : '---';
width: getProportionalDimmension(30)
horizontalAlignment: Text.AlignRight
font.pixelSize: ScreenTools.smallFontPixelSize
font.weight: Font.DemiBold
color: colorWhite
}
QGCLabel {
text: (activeVehicle.batteryConsumed > 0) ? activeVehicle.batteryConsumed.toFixed(0) + 'mAh' : '---';
width: getProportionalDimmension(30)
horizontalAlignment: Text.AlignRight
font.pixelSize: ScreenTools.smallFontPixelSize
font.weight: Font.DemiBold
color: colorWhite
}
}
}
QGCButton {
width: ScreenTools.defaultFontPixelWidth * 11
height: cellHeight
anchors.verticalCenter: parent.verticalCenter
text: activeVehicle.armed ? "Armed" : "Disarmed"
menu: Menu {
MenuItem {
enabled: !activeVehicle.armed
text: "Arm"
onTriggered: activeVehicle.armed = true
}
MenuItem {
enabled: activeVehicle.armed
text: "Disarm"
onTriggered: activeVehicle.armed = false
}
}
}
QGCButton {
width: ScreenTools.defaultFontPixelWidth * 16
height: cellHeight
anchors.verticalCenter: parent.verticalCenter
text: activeVehicle.flightMode
menu: activeVehicle.flightModeSetAvailable ? flightModesMenu : null
Menu {
id: flightModesMenu
}
Component {
id: flightModeMenuItemComponent
MenuItem {
checkable: true
checked: activeVehicle.flightMode == text
onTriggered: activeVehicle.flightMode = text
}
}
property var flightModesMenuItems: []
function updateFlightModesMenu() {
if (activeVehicle.flightModeSetAvailable) {
// Remove old menu items
for (var i=0; i<flightModesMenuItems.length; i++) {
flightModesMenu.removeItem(flightModesMenuItems[i])
}
flightModesMenuItems.length = 0
// Add new items
for (var i=0; i<activeVehicle.flightModes.length; i++) {
var menuItem = flightModeMenuItemComponent.createObject(null, { "text": activeVehicle.flightModes[i] })
flightModesMenuItems.push(menuItem)
flightModesMenu.insertItem(i, menuItem)
}
}
}
Component.onCompleted: updateFlightModesMenu()
Connections {
target: multiVehicleManager
onActiveVehicleChanged: parent.updateFlightModesMenu
}
}
Rectangle {
width: ScreenTools.defaultFontPixelWidth * 4
height: cellHeight
anchors.verticalCenter: parent.verticalCenter
color: colorBlue
border.width: 0
visible: activeVehicle.hilMode
QGCLabel { */
anchors.fill: parent
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
text: "HIL"
}
}
} // Row } // Row
/*=====================================================================
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 Main Tool Signal Strength
* @author Gus Grubba <mavlink@grubba.com>
*/
import QtQuick 2.4
import QGroundControl.Controls 1.0
Item {
id: signalRoot
property real size: 50
property real percent: 0
width: size
height: size
function getIcon() {
if (percent < 20)
return "/qmlimages/Signal0.svg"
if (percent < 40)
return "/qmlimages/Signal20.svg"
if (percent < 60)
return "/qmlimages/Signal40.svg"
if (percent < 80)
return "/qmlimages/Signal60.svg"
if (percent < 100)
return "/qmlimages/Signal80.svg"
return "/qmlimages/Signal100.svg"
}
Image {
source: getIcon()
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
anchors.fill: parent
}
}
...@@ -8,5 +8,14 @@ VERSIONNAME=`git describe --always --tags | sed -e 's/^v//'` ...@@ -8,5 +8,14 @@ VERSIONNAME=`git describe --always --tags | sed -e 's/^v//'`
echo "VersionCode: ${VERSIONCODE}" echo "VersionCode: ${VERSIONCODE}"
echo "VersionName: ${VERSIONNAME}" echo "VersionName: ${VERSIONNAME}"
sed -i -e "s/android:versionCode=\"[0-9][0-9]*\"/android:versionCode=\"${VERSIONCODE}\"/" $MANIFEST_FILE if [ -n "$VERSIONCODE" ]; then
sed -i -e 's/versionName *= *"[^"]*"/versionName="'$VERSIONNAME'"/' $MANIFEST_FILE sed -i -e "s/android:versionCode=\"[0-9][0-9]*\"/android:versionCode=\"$VERSIONCODE\"/" $MANIFEST_FILE
else
echo "Error versionCode empty"
fi
if [ -n "$VERSIONNAME" ]; then
sed -i -e 's/versionName *= *"[^"]*"/versionName="'$VERSIONNAME'"/' $MANIFEST_FILE
else
echo "Error versionName empty"
fi
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