summaryrefslogtreecommitdiffstats
path: root/imports
diff options
context:
space:
mode:
Diffstat (limited to 'imports')
-rw-r--r--imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/backspace-868482.svg75
-rw-r--r--imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/check-868482.svg8
-rw-r--r--imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/enter-868482.svg13
-rw-r--r--imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/globe-868482.svg56
-rw-r--r--imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/handwriting-868482.svg54
-rw-r--r--imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/hidekeyboard-868482.svg281
-rw-r--r--imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/search-868482.svg14
-rw-r--r--imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/shift-80c342.pngbin0 -> 906 bytes
-rw-r--r--imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/shift-868482.svg12
-rw-r--r--imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/shift-c5d6b6.svg12
-rw-r--r--imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/textmode-868482.svg87
-rw-r--r--imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/style.qml888
-rw-r--r--imports/shared/assets/drawable-ldpi/FloatingButton_Active.svg41
-rw-r--r--imports/shared/assets/drawable-ldpi/FloatingButton_Available.svg41
-rw-r--r--imports/shared/assets/drawable-ldpi/FloatingButton_Unavailable.svg39
-rw-r--r--imports/shared/assets/icons/4g-signal-strength.pngbin0 -> 162 bytes
-rw-r--r--imports/shared/assets/icons/Built_with_Qt_RGB_logo_white.pngbin0 -> 5641 bytes
-rw-r--r--imports/shared/assets/icons/CarFocusButton.pngbin0 -> 27596 bytes
-rw-r--r--imports/shared/assets/icons/CarInfo.pngbin0 -> 18254 bytes
-rw-r--r--imports/shared/assets/icons/FullScreenGradient.pngbin0 -> 8315287 bytes
-rw-r--r--imports/shared/assets/icons/Highlight.pngbin0 -> 7346 bytes
-rw-r--r--imports/shared/assets/icons/MapOverlayEdgeGradient.pngbin0 -> 23564 bytes
-rw-r--r--imports/shared/assets/icons/MiddleMask.pngbin0 -> 230195 bytes
-rw-r--r--imports/shared/assets/icons/MusicOverlayGradient.pngbin0 -> 7293 bytes
-rw-r--r--imports/shared/assets/icons/MusicOverlayGradient2.pngbin0 -> 10917 bytes
-rw-r--r--imports/shared/assets/icons/NavRoundmarker.pngbin0 -> 21011 bytes
-rw-r--r--imports/shared/assets/icons/RectangleGradient256x512.pngbin0 -> 4373 bytes
-rw-r--r--imports/shared/assets/icons/SimpleBottomBackground.pngbin0 -> 1187751 bytes
-rw-r--r--imports/shared/assets/icons/acautosync-knob-down.pngbin0 -> 37727 bytes
-rw-r--r--imports/shared/assets/icons/acautosync-knob-up.pngbin0 -> 14943 bytes
-rw-r--r--imports/shared/assets/icons/back-background.pngbin0 -> 4982 bytes
-rw-r--r--imports/shared/assets/icons/back.pngbin0 -> 381 bytes
-rw-r--r--imports/shared/assets/icons/background-contacts.pngbin0 -> 16624 bytes
-rw-r--r--imports/shared/assets/icons/bluetooth.pngbin0 -> 768 bytes
-rw-r--r--imports/shared/assets/icons/calendar.pngbin0 -> 20646 bytes
-rw-r--r--imports/shared/assets/icons/cancel.pngbin0 -> 633 bytes
-rw-r--r--imports/shared/assets/icons/car-info.pngbin0 -> 3276 bytes
-rw-r--r--imports/shared/assets/icons/contacts.pngbin0 -> 2923 bytes
-rw-r--r--imports/shared/assets/icons/destination-airport.pngbin0 -> 809 bytes
-rw-r--r--imports/shared/assets/icons/destination-home.pngbin0 -> 551 bytes
-rw-r--r--imports/shared/assets/icons/destination-work.pngbin0 -> 450 bytes
-rw-r--r--imports/shared/assets/icons/fandirection-head.pngbin0 -> 2008 bytes
-rw-r--r--imports/shared/assets/icons/fandirection-headandlegs.pngbin0 -> 2245 bytes
-rw-r--r--imports/shared/assets/icons/fandirection-knob-down.pngbin0 -> 51433 bytes
-rw-r--r--imports/shared/assets/icons/fandirection-knob-up.pngbin0 -> 53297 bytes
-rw-r--r--imports/shared/assets/icons/fandirection-legs.pngbin0 -> 1949 bytes
-rw-r--r--imports/shared/assets/icons/fandirection-windshield.pngbin0 -> 2136 bytes
-rw-r--r--imports/shared/assets/icons/fandirection-windshieldandlegs.pngbin0 -> 2371 bytes
-rw-r--r--imports/shared/assets/icons/fandirection.pngbin0 -> 1454 bytes
-rw-r--r--imports/shared/assets/icons/jane.pngbin0 -> 26924 bytes
-rw-r--r--imports/shared/assets/icons/john.pngbin0 -> 16003 bytes
-rw-r--r--imports/shared/assets/icons/music.pngbin0 -> 1913 bytes
-rw-r--r--imports/shared/assets/icons/placeofinterest-charging.pngbin0 -> 667 bytes
-rw-r--r--imports/shared/assets/icons/placeofinterest-coffee.pngbin0 -> 1385 bytes
-rw-r--r--imports/shared/assets/icons/placeofinterest-parking.pngbin0 -> 963 bytes
-rw-r--r--imports/shared/assets/icons/placeofinterest-shopping.pngbin0 -> 1014 bytes
-rw-r--r--imports/shared/assets/icons/screencast.pngbin0 -> 723 bytes
-rw-r--r--imports/shared/assets/icons/search.pngbin0 -> 17167 bytes
-rw-r--r--imports/shared/assets/icons/video-next.pngbin0 -> 641 bytes
-rw-r--r--imports/shared/assets/icons/video-pause.pngbin0 -> 168 bytes
-rw-r--r--imports/shared/assets/icons/video-play.pngbin0 -> 815 bytes
-rw-r--r--imports/shared/assets/icons/video-previous.pngbin0 -> 647 bytes
-rw-r--r--imports/shared/assets/icons/video.pngbin0 -> 1487 bytes
-rw-r--r--imports/shared/assets/icons/wifi-signal-strength.pngbin0 -> 779 bytes
-rw-r--r--imports/shared/controls/AppStackView.qml86
-rw-r--r--imports/shared/controls/Button_neptune.qml91
-rw-r--r--imports/shared/controls/DisplayBackground.qml43
-rw-r--r--imports/shared/controls/Icon.qml53
-rw-r--r--imports/shared/controls/Label.qml43
-rw-r--r--imports/shared/controls/LaunchItemBackground.qml62
-rw-r--r--imports/shared/controls/Slider.qml118
-rw-r--r--imports/shared/controls/SwipeView.qml80
-rw-r--r--imports/shared/controls/Symbol.qml51
-rw-r--r--imports/shared/controls/Tool.qml63
-rw-r--r--imports/shared/controls/qmldir14
-rw-r--r--imports/shared/service/climate/ClimateService.qml134
-rw-r--r--imports/shared/service/climate/ClimateStateMachine.qml169
-rw-r--r--imports/shared/service/climate/qmldir1
-rw-r--r--imports/shared/service/movie/MovieService.qml67
-rw-r--r--imports/shared/service/movie/qmldir1
-rw-r--r--imports/shared/service/music/MusicService.qml118
-rw-r--r--imports/shared/service/music/qmldir1
-rw-r--r--imports/shared/service/settings/SettingsService.qml124
-rw-r--r--imports/shared/service/settings/qmldir1
-rw-r--r--imports/shared/service/statusbar/StatusBarService.qml60
-rw-r--r--imports/shared/service/statusbar/qmldir1
-rw-r--r--imports/shared/service/valuesource/ValueSource.qml282
-rw-r--r--imports/shared/service/valuesource/qmldir1
-rw-r--r--imports/shared/utils/AppUIScreen.qml109
-rw-r--r--imports/shared/utils/AutoConfig.qml118
-rw-r--r--imports/shared/utils/Spacer.qml51
-rw-r--r--imports/shared/utils/Style.qml227
-rw-r--r--imports/shared/utils/Tracer.qml62
-rw-r--r--imports/shared/utils/UIElement.qml47
-rw-r--r--imports/shared/utils/UIScreen.qml70
-rw-r--r--imports/shared/utils/qmldir12
-rw-r--r--imports/system/models/ApplicationManagerInterface.qml173
-rw-r--r--imports/system/models/qmldir1
98 files changed, 4155 insertions, 0 deletions
diff --git a/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/backspace-868482.svg b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/backspace-868482.svg
new file mode 100644
index 0000000..09928cc
--- /dev/null
+++ b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/backspace-868482.svg
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<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"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ viewBox="-420 107 159 88"
+ enable-background="new -420 107 159 88"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="backspace-868482.svg"><metadata
+ id="metadata3483"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs3481" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1136"
+ id="namedview3479"
+ showgrid="false"
+ inkscape:zoom="4.327044"
+ inkscape:cx="109.27575"
+ inkscape:cy="20.181193"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="g3463" /><g
+ id="g3459"><rect
+ x="-420"
+ y="107"
+ fill="none"
+ width="159"
+ height="88"
+ id="rect3461" /><g
+ id="g3463"><g
+ id="g3465"><path
+ d="m -261.2,195 -114.8,0 -44,-44 44,-44 114.8,0 z m -112.17994,-3.67355 107.81308,-0.2311 0,-79.72849 -108.27529,0 -39.40204,39.40204 z"
+ id="path3467"
+ inkscape:connector-curvature="0"
+ style="fill:#868482"
+ sodipodi:nodetypes="cccccccccccc" /></g><g
+ id="g3469"
+ transform="translate(5.315407,3.0043605)"><g
+ id="g3471"><rect
+ x="-327.47067"
+ y="128.42934"
+ transform="matrix(-0.7071,-0.7071,0.7071,-0.7071,-665.0558,26.5252)"
+ width="6.0706396"
+ height="50.470654"
+ id="rect3473"
+ style="fill:#868482" /></g><g
+ id="g3475"><rect
+ x="-351.79507"
+ y="151.44643"
+ transform="matrix(-0.7071,-0.7071,0.7071,-0.7071,-665.0499,26.5255)"
+ width="52.595058"
+ height="5.2535815"
+ id="rect3477"
+ style="fill:#868482" /></g></g></g></g></svg> \ No newline at end of file
diff --git a/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/check-868482.svg b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/check-868482.svg
new file mode 100644
index 0000000..c8af5f3
--- /dev/null
+++ b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/check-868482.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.1, 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="-414 91 170 119" enable-background="new -414 91 170 119" xml:space="preserve">
+<g>
+ <polygon fill="#868482" points="-351.7,210 -414,147.7 -402.7,136.3 -351.7,187.3 -255.3,91 -244,102.3 "/>
+</g>
+</svg>
diff --git a/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/enter-868482.svg b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/enter-868482.svg
new file mode 100644
index 0000000..75080f6
--- /dev/null
+++ b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/enter-868482.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.1, 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="-394 111 211 80" enable-background="new -394 111 211 80" xml:space="preserve">
+<g>
+ <rect x="-394" y="111" fill="none" width="211" height="80"/>
+ <g>
+ <rect x="-384.8" y="144.8" fill="#868482" width="201.8" height="12.3"/>
+ <rect x="-195.3" y="121.7" fill="#868482" width="12.3" height="35.3"/>
+ <polygon fill="#868482" points="-349.5,111 -349.5,190.8 -394,151.7 "/>
+ </g>
+</g>
+</svg>
diff --git a/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/globe-868482.svg b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/globe-868482.svg
new file mode 100644
index 0000000..318fea8
--- /dev/null
+++ b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/globe-868482.svg
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<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"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ viewBox="-427 79 144 144"
+ enable-background="new -427 79 144 144"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="globe-868482.svg"><metadata
+ id="metadata3793"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs3791" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1136"
+ id="namedview3789"
+ showgrid="false"
+ inkscape:zoom="4.6354778"
+ inkscape:cx="15.443116"
+ inkscape:cy="49.492945"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><g
+ id="g3781"><rect
+ x="-427"
+ y="79"
+ fill="none"
+ width="144"
+ height="144"
+ id="rect3783" /><g
+ id="g3785"><path
+ d="m -355,223 c -39.5,0 -71.8,-32.1 -72,-71.6 -0.2,-39.7 31.9,-72.2 71.6,-72.4 l 0.7,0 c 19.1,0.1 37.1,7.6 50.6,21.1 13.5,13.5 21,31.5 21.1,50.5 0.1,19.2 -7.3,37.4 -20.8,51 -13.5,13.7 -31.6,21.3 -50.8,21.4 z m 3.22136,-42.7 0,35.96737 c 9,-8.1 18.80446,-20.05728 23.40446,-30.85728 -6.7,-2 -16.40446,-4.71009 -23.40446,-5.11009 z M -380,183.9 c 3.2,7.4 9.01009,18.18309 14.31009,24.48309 2.4,2.9 5.74718,4.95282 8.54718,7.45282 L -357.57418,180.3 c -7,0.4 -15.62582,1.6 -22.42582,3.6 z m 58.2,3 c -3.9,9.1 -15.88755,21.48309 -22.58755,28.98309 10.4,-2.9 26.58755,-12.38309 34.48755,-20.28309 0.5,-0.5 1,-1.1 1.6,-1.6 -4.4,-2.9 -8.9,-5.2 -13.5,-7.1 z m -82.073,8.72582 c 7.8,8.5 28.47064,18.03591 39.87064,21.23591 -0.5,-0.6 -4.98309,-5.51455 -5.48309,-6.11455 -6,-7.1 -11.01573,-15.54718 -14.51573,-23.94718 -4.7,2 -15.57182,6.02582 -19.87182,8.82582 z m 83.03145,-13.68991 c 5.5,2.3 12.95728,7.04155 18.05728,10.34155 6.5,-9.4 12.773,-28.06619 13.573,-39.56619 l -25.48873,0 c -0.1,1.2 -0.1,4.98873 -0.2,6.28873 -0.7,6.8 -3.94155,16.63591 -5.94155,22.93591 z m -100.59436,-27.93027 c 0.8,11.8 7.60446,27.13027 14.00446,36.33027 5.1,-3.3 15.36173,-6.96291 20.76173,-9.26291 -2.4,-7.5 -8.23028,-19.71455 -8.63028,-27.71455 z m 31.16854,-0.64719 c 0.3,7 6.03028,19.84037 8.13028,26.44037 7.7,-2.4 16.56291,-3.36854 24.56291,-3.66854 l 0.21573,-23.20328 z m 38.48873,22.34037 c 8,0.4 16.97864,2.77864 24.67864,5.17864 1.7,-5.6 5.70446,-15.59882 6.20446,-21.59882 0.1,-1 0.53145,-6.53028 0.63145,-7.43028 l -31.51455,0.64718 z M -314.8,146.7 l 25.58873,0 c -0.8,-11.5 -6.973,-24.55727 -13.573,-33.95727 -5.1,3.4 -11.79437,5.76854 -17.39437,8.06854 2.5,7.5 4.97864,17.88873 5.37864,25.88873 z m -37.19436,0.86291 31.73027,-1.07864 c -0.4,-7 -3.32582,-17.46736 -5.42582,-24.06736 -7.7,2.4 -18.95164,4.34718 -26.95164,4.74718 z m -37.95728,0.43145 32.16173,0 0,-20.83027 c -7.9,-0.4 -20.97746,-0.83709 -28.57746,-3.23709 -1.8,5.8 -3.21572,13.41009 -3.81572,19.61009 -0.1,0.8 0.23145,3.65727 0.23145,4.45727 z m -31.69999,0.86292 26.45163,-0.64719 c 0.1,-1 0.1,-3.51009 0.2,-4.51009 0.6,-7 2,-13.8 4,-20.3 -5.5,-2.3 -13.92018,-6.39436 -19.02018,-9.79436 -6.4,9.1 -10.83145,23.45164 -11.63145,35.25164 z m 68.57863,-63.07183 0.21573,35.69882 c 6.9,-0.3 18.23027,-1.5 24.93027,-3.5 -1.37418,-7.31572 -7.3,-14.54718 -12.5,-20.64718 -2.4,-2.9 -9.846,-9.05164 -12.646,-11.55164 z m -30.94155,33.27746 c 6.7,2 18.89319,2.33709 25.79319,2.63709 l 0.64718,-35.698822 c -8.9,7.9 -21.84037,22.461732 -26.44037,33.061732 z m 38.29554,-34.224642 c 0.8,0.9 7.42465,6.977459 8.22465,7.977459 5.9,6.9 11.89436,14.384273 15.39436,22.484273 4.7,-2 12.96737,-4.73145 17.36737,-7.63145 -0.6,-0.6 -1.63146,-1.84719 -2.23146,-2.54719 -9.29436,-11.451637 -28.15492,-17.483092 -38.75492,-20.283092 z M -406.246,107.88427 c 4.4,2.8 12.78309,7.78873 17.48309,9.68873 4,-9.3 17.48192,-24.803277 24.48192,-32.303277 -11.8,3.2 -33.96501,13.91455 -41.96501,22.614547 z"
+ id="path3787"
+ inkscape:connector-curvature="0"
+ style="fill:#868482"
+ sodipodi:nodetypes="scccscccscccccccccccscccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" /></g></g></svg> \ No newline at end of file
diff --git a/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/handwriting-868482.svg b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/handwriting-868482.svg
new file mode 100644
index 0000000..1474654
--- /dev/null
+++ b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/handwriting-868482.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<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"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 156 104"
+ enable-background="new 0 0 156 104"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="handwriting-868482.svg"><metadata
+ id="metadata3399"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs3397" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1136"
+ id="namedview3395"
+ showgrid="false"
+ inkscape:zoom="9.2948718"
+ inkscape:cx="83.191118"
+ inkscape:cy="52"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><g
+ id="g3387"><g
+ id="g3389"><path
+ d="m 37.922759,97.167586 c -10.1,0 -11.046207,-1.342069 -16.967587,-8.651034 -8.271034,-21 1.526897,-31.697931 17.826897,-48.997931 1.2,-1.2 7.241379,-9.493104 8.441379,-10.793104 5.3,-5.7 1.111724,-14.727586 -0.588276,-18.027586 -1.8,-3.4 -11.309655,-4.0393103 -16.009655,-3.3393103 -16.5,2.6 -24.7503446,30.7034483 -24.7503446,30.9034483 L 0,36.6 C 0.3,35.3 6.4,4.3 31.2,0.3 41,-1.3 49.7,2.7 53.9,10.7 c 4.7,8.9 2.6,20.1 -5.3,28.6 -1.2,1.3 -2.4,2.6 -3.6,3.8 -16.7,17.8 -25.9,28.5 -19.6,41.4 3.3,6.8 11.1,7.6 16.9,6.3 C 51.5,88.7 62.1,79.7 62,61.3 61.8,33.2 78.2,19.5 92.2,16.4 c 14.5,-3.2 26.67862,3.922759 32.97862,17.322759 1.3,2.8 2.83793,5.077241 3.63793,7.777241 13.3,0.7 25.82276,5.375862 26.32276,5.475862 l -2.32414,5.044828 c -0.1,0 -12.71241,-4.306207 -23.61241,-5.306207 2.11379,17.360689 -3.65104,36.323448 -15.68897,41.155172 C 101.61379,93.869655 87.9,92.1 83,83.1 79.9,77.5 81.1,68.4 85.9,60.6 c 7.9,-13 25.71103,-17.615172 35.91103,-19.015172 -0.4,-1.2 -3.26689,-7.456552 -3.76689,-8.456552 -3.9,-8.3 -16.07311,-13.368276 -24.973106,-11.368276 -9.7,2.2 -26.056551,18.017241 -25.856551,39.017241 0.2,25.5 -9.682759,32.613104 -23.082759,35.813104 -2.6,0.6 -3.808965,0.577241 -6.208965,0.577241 z M 123.02759,47.137241 c -14,1.5 -27.377935,6.671035 -32.222073,16.235173 -4.569547,5.48009 -6.825089,15.074863 -1.501379,19.937241 10.744832,7.956552 19.564832,1.708966 24.404142,-1.198621 10.58482,-6.253103 9.81931,-26.073793 9.31931,-34.973793 z"
+ id="path3391"
+ inkscape:connector-curvature="0"
+ style="fill:#868482"
+ sodipodi:nodetypes="sccccccccccccccccccccccccccccsccccc" /></g><rect
+ fill="none"
+ width="156"
+ height="104"
+ id="rect3393" /></g></svg> \ No newline at end of file
diff --git a/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/hidekeyboard-868482.svg b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/hidekeyboard-868482.svg
new file mode 100644
index 0000000..5443e30
--- /dev/null
+++ b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/hidekeyboard-868482.svg
@@ -0,0 +1,281 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<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"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ viewBox="-427 87 144 127"
+ enable-background="new -427 87 144 127"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="hidekeyboard-868482.svg"><metadata
+ id="metadata3534"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs3532" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1136"
+ id="namedview3530"
+ showgrid="false"
+ inkscape:zoom="3.8188977"
+ inkscape:cx="57.633466"
+ inkscape:cy="81.826203"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="g3468" /><g
+ id="g3464"><rect
+ x="-427"
+ y="87"
+ fill="none"
+ width="144"
+ height="127"
+ id="rect3466" /><g
+ id="g3468"><g
+ id="g3470" /><g
+ id="g3498"
+ transform="matrix(0.6642876,0,0,0.60833553,-135.10074,52.111516)"><rect
+ x="-407.5"
+ y="126.7"
+ width="11.7"
+ height="11.7"
+ id="rect3500"
+ style="fill:#868482" /></g><g
+ id="g3522"
+ transform="matrix(1,0,0,0.53000264,-0.26185567,72.641448)"><rect
+ x="-388.89999"
+ y="146.2"
+ width="67.699997"
+ height="11.7"
+ id="rect3524"
+ style="fill:#868482" /></g><polygon
+ style="fill:#868482"
+ id="polygon3528"
+ points="-381.1,195.2 -355,213.9 -328.9,195.2 -345.2,195.2 -355,202.2 -364.8,195.2 " /><g
+ id="g3498-5"
+ transform="matrix(0.6642876,0,0,0.60833553,-116.19714,52.058942)"><rect
+ x="-407.5"
+ y="126.7"
+ width="11.7"
+ height="11.7"
+ id="rect3500-7"
+ style="fill:#868482" /></g><g
+ id="g3498-5-4"
+ transform="matrix(0.6642876,0,0,0.60833553,-78.8827,51.666158)"><rect
+ x="-407.5"
+ y="126.7"
+ width="11.7"
+ height="11.7"
+ id="rect3500-7-0"
+ style="fill:#868482" /></g><g
+ id="g3498-5-43"
+ transform="matrix(0.6642876,0,0,0.60833553,-97.474452,51.928014)"><rect
+ x="-407.5"
+ y="126.7"
+ width="11.7"
+ height="11.7"
+ id="rect3500-7-4"
+ style="fill:#868482" /></g><g
+ id="g3498-5-2"
+ transform="matrix(0.6642876,0,0,0.60833553,-60.16002,51.666158)"><rect
+ x="-407.5"
+ y="126.7"
+ width="11.7"
+ height="11.7"
+ id="rect3500-7-6"
+ style="fill:#868482" /></g><g
+ id="g3498-5-3"
+ transform="matrix(0.6642876,0,0,0.60833553,-41.568267,51.797086)"><rect
+ x="-407.5"
+ y="126.7"
+ width="11.7"
+ height="11.7"
+ id="rect3500-7-64"
+ style="fill:#868482" /></g><g
+ id="g3498-5-0"
+ transform="matrix(0.6642876,0,0,0.60833553,-41.306411,32.419767)"><rect
+ x="-407.5"
+ y="126.7"
+ width="11.7"
+ height="11.7"
+ id="rect3500-7-60"
+ style="fill:#868482" /></g><g
+ id="g3498-5-5"
+ transform="matrix(0.6642876,0,0,0.60833553,-60.290947,32.419767)"><rect
+ x="-407.5"
+ y="126.7"
+ width="11.7"
+ height="11.7"
+ id="rect3500-7-1"
+ style="fill:#868482" /></g><g
+ id="g3498-5-34"
+ transform="matrix(0.6642876,0,0,0.60833553,-78.751772,32.288839)"><rect
+ x="-407.5"
+ y="126.7"
+ width="11.7"
+ height="11.7"
+ id="rect3500-7-8"
+ style="fill:#868482" /></g><g
+ id="g3498-5-28"
+ transform="matrix(0.6642876,0,0,0.60833553,-97.60538,32.419766)"><rect
+ x="-407.5"
+ y="126.7"
+ width="11.7"
+ height="11.7"
+ id="rect3500-7-08"
+ style="fill:#868482" /></g><g
+ id="g3498-5-8"
+ transform="matrix(0.6642876,0,0,0.60833553,-116.45899,32.288839)"><rect
+ x="-407.5"
+ y="126.7"
+ width="11.7"
+ height="11.7"
+ id="rect3500-7-66"
+ style="fill:#868482" /></g><g
+ id="g3498-5-6"
+ transform="matrix(0.6642876,0,0,0.60833553,-134.91981,32.550694)"><rect
+ x="-407.5"
+ y="126.7"
+ width="11.7"
+ height="11.7"
+ id="rect3500-7-85"
+ style="fill:#868482" /></g><g
+ id="g3498-2"
+ transform="matrix(0.56357388,0,0,7.7030576,-197.43282,-888.87016)"><rect
+ x="-407.5"
+ y="126.7"
+ width="11.7"
+ height="11.7"
+ id="rect3500-3"
+ style="fill:#868482" /></g><g
+ id="g3498-2-4"
+ transform="matrix(0.56357388,0,0,7.7030576,-59.762201,-888.87016)"><rect
+ x="-407.5"
+ y="126.7"
+ width="11.7"
+ height="11.7"
+ id="rect3500-3-6"
+ style="fill:#868482" /></g><g
+ id="g3498-50"
+ transform="matrix(11.474227,0,0,0.60833553,4253.5026,93.039354)"><rect
+ x="-407.5"
+ y="126.7"
+ width="11.7"
+ height="11.7"
+ id="rect3500-1"
+ style="fill:#868482" /></g><g
+ id="g3498-50-9"
+ transform="matrix(11.474227,0,0,0.60833553,4252.9789,9.9001791)"><rect
+ x="-407.5"
+ y="126.7"
+ width="11.7"
+ height="11.7"
+ id="rect3500-1-4"
+ style="fill:#868482" /></g><path
+ style="fill:#999999;fill-opacity:1"
+ d="m -0.0757732,45.191067 0,-45.0182098 3.2404639,-0.08614494 C 7.3998563,-0.02587596 134.35087,-0.02575465 139.85335,0.08684287 l 4.22242,0.08640373 0,45.0180154 0,45.018016 -72.07577,0 -72.0757732,0 0,-45.018211 z m 137.7360832,-0.08643 0,-38.0345359 -65.594846,0 -65.5948454,0 0,38.0345359 0,38.034536 65.5948454,0 65.594846,0 0,-38.034536 z"
+ id="path3720"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /><path
+ style="fill:#ffffff"
+ d="m 21.265464,45.759278 0,-3.469587 3.796907,0 3.796907,0 0,3.469587 0,3.469588 -3.796907,0 -3.796907,0 0,-3.469588 z"
+ id="path3722"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /><path
+ style="fill:#999999;fill-opacity:1"
+ d="m 21.396392,26.185567 0,-3.535052 3.862371,0 3.862371,0 0,3.535052 0,3.535052 -3.862371,0 -3.862371,0 0,-3.535052 z"
+ id="path3724"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /><path
+ style="fill:#999999;fill-opacity:1"
+ d="m 39.857216,25.923711 0,-3.535051 3.862372,0 3.862371,0 0,3.535051 0,3.535052 -3.862371,0 -3.862372,0 0,-3.535052 z"
+ id="path3726"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /><path
+ style="fill:#ffffff"
+ d="m 40.119072,45.693814 0,-3.535051 3.862371,0 3.862371,0 0,3.535051 0,3.535052 -3.862371,0 -3.862371,0 0,-3.535052 z"
+ id="path3728"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /><path
+ style="fill:#999999;fill-opacity:1"
+ d="m 58.841753,45.562887 0,-3.535052 3.862371,0 3.862371,0 0,3.535052 0,3.535051 -3.862371,0 -3.862371,0 0,-3.535051 z"
+ id="path3730"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /><path
+ style="fill:#ffffff"
+ d="m 58.710825,26.054639 0,-3.535051 3.862371,0 3.862371,0 0,3.535051 0,3.535052 -3.862371,0 -3.862371,0 0,-3.535052 z"
+ id="path3732"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /><path
+ style="fill:#999999;fill-opacity:1"
+ d="m 77.564433,25.923711 0,-3.535051 3.862371,0 3.862371,0 0,3.535051 0,3.535052 -3.862371,0 -3.862371,0 0,-3.535052 z"
+ id="path3734"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /><path
+ style="fill:#999999;fill-opacity:1"
+ d="m 77.433505,45.301031 0,-3.535052 3.862371,0 3.862371,0 0,3.535052 0,3.535051 -3.862371,0 -3.862371,0 0,-3.535051 z"
+ id="path3736"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /><path
+ style="fill:#999999;fill-opacity:1"
+ d="m 96.156186,45.301031 0,-3.535052 3.862374,0 3.86237,0 0,3.535052 0,3.535051 -3.86237,0 -3.862374,0 0,-3.535051 z"
+ id="path3738"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /><path
+ style="fill:#999999;fill-opacity:1"
+ d="m 96.025258,26.054639 0,-3.535051 3.862371,0 3.862371,0 0,3.535051 0,3.535052 -3.862371,0 -3.862371,0 0,-3.535052 z"
+ id="path3740"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /><path
+ style="fill:#999999;fill-opacity:1"
+ d="m 115.00979,26.054639 0,-3.535051 3.86237,0 3.86238,0 0,3.535051 0,3.535052 -3.86238,0 -3.86237,0 0,-3.535052 z"
+ id="path3742"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /><path
+ style="fill:#999999;fill-opacity:1"
+ d="m 114.74794,45.431959 0,-3.535052 3.86237,0 3.86237,0 0,3.535052 0,3.535051 -3.86237,0 -3.86237,0 0,-3.535051 z"
+ id="path3744"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /><path
+ style="fill:#999999;fill-opacity:1"
+ d="m 37.893299,66.249485 0,-3.011341 33.779381,0 33.77938,0 0,3.011341 0,3.01134 -33.77938,0 -33.779381,0 0,-3.01134 z"
+ id="path3746"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /><path
+ style="fill:#999999;fill-opacity:1"
+ d="m 64.14433,121.20799 c -4.320619,-3.09875 -10.146368,-7.27582 -12.94611,-9.28238 l -5.090439,-3.64829 8.049329,0 8.04933,0 4.883685,3.48882 c 3.894822,2.78239 4.926318,3.46219 5.094241,3.35732 0.115806,-0.0723 2.325191,-1.64229 4.909744,-3.48882 l 4.699189,-3.35732 8.052119,0 8.052118,0 -0.510624,0.36756 c -0.280842,0.20216 -5.931036,4.24862 -12.555984,8.99213 -6.624949,4.7435 -12.222114,8.75517 -12.438144,8.91481 L 72,126.84208 64.14433,121.20799 Z"
+ id="path3748"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /><path
+ style="fill:#999999;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 58.890373,26.058333 0,-3.404124 3.665979,0 3.66598,0 0,3.404124 0,3.404124 -3.66598,0 -3.665979,0 0,-3.404124 z"
+ id="path5455"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /><path
+ style="fill:#999999;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 21.445012,45.697508 0,-3.404124 3.66598,0 3.665979,0 0,3.404124 0,3.404124 -3.665979,0 -3.66598,0 0,-3.404124 z"
+ id="path5482"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /><path
+ style="fill:#999999;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 40.29862,45.697508 0,-3.404124 3.66598,0 3.665979,0 0,3.404124 0,3.404124 -3.665979,0 -3.66598,0 0,-3.404124 z"
+ id="path5484"
+ inkscape:connector-curvature="0"
+ transform="translate(-427,87)" /></g></g></svg> \ No newline at end of file
diff --git a/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/search-868482.svg b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/search-868482.svg
new file mode 100644
index 0000000..6ee0ba9
--- /dev/null
+++ b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/search-868482.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.1, 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="-425 77 148 148" enable-background="new -425 77 148 148" xml:space="preserve">
+<g>
+ <rect x="-425" y="77" fill="none" width="148" height="148"/>
+ <g>
+ <path fill="#868482" d="M-278.2,209.7c1.6,1.6,1.6,4.1,0,5.7l-8.5,8.5c-1.6,1.6-4.1,1.6-5.7,0l-44.6-44.6c-1.6-1.6-1.6-4.1,0-5.7
+ l8.5-8.5c1.6-1.6,4.1-1.6,5.7,0L-278.2,209.7z"/>
+ <path fill="#868482" d="M-367,89c25.4,0,46,20.6,46,46s-20.6,46-46,46c-25.4,0-46-20.6-46-46S-392.4,89-367,89 M-367,77
+ c-32,0-58,26-58,58s26,58,58,58c32,0,58-26,58-58S-335,77-367,77L-367,77z"/>
+ </g>
+</g>
+</svg>
diff --git a/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/shift-80c342.png b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/shift-80c342.png
new file mode 100644
index 0000000..a864a6e
--- /dev/null
+++ b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/shift-80c342.png
Binary files differ
diff --git a/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/shift-868482.svg b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/shift-868482.svg
new file mode 100644
index 0000000..f0ce693
--- /dev/null
+++ b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/shift-868482.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.1, 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="-427 84 144 134" enable-background="new -427 84 144 134" xml:space="preserve">
+<g>
+ <rect x="-427" y="84" fill="none" width="144" height="134"/>
+ <g>
+ <path fill="#868482" d="M-323.4,218h-63.4v-56.5H-427l71.9-77.5l71.9,77.5h-40.2L-323.4,218L-323.4,218z M-375.3,206.5h40.5v-56.5
+ h25.4l-45.7-49.2l-45.7,49.2h25.4L-375.3,206.5L-375.3,206.5z"/>
+ </g>
+</g>
+</svg>
diff --git a/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/shift-c5d6b6.svg b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/shift-c5d6b6.svg
new file mode 100644
index 0000000..6cfc345
--- /dev/null
+++ b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/shift-c5d6b6.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.1, 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="-427 84 144 134" enable-background="new -427 84 144 134" xml:space="preserve">
+<g>
+ <rect x="-427" y="84" fill="none" width="144" height="134"/>
+ <g>
+ <path fill="#C5D6B6" d="M-323.4,218h-63.4v-56.5H-427l71.9-77.5l71.9,77.5h-40.2L-323.4,218L-323.4,218z M-375.3,206.5h40.5v-56.5
+ h25.4l-45.7-49.2l-45.7,49.2h25.4L-375.3,206.5L-375.3,206.5z"/>
+ </g>
+</g>
+</svg>
diff --git a/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/textmode-868482.svg b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/textmode-868482.svg
new file mode 100644
index 0000000..16b4071
--- /dev/null
+++ b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/images/textmode-868482.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<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"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ width="124px"
+ height="96px"
+ viewBox="0 0 124 96"
+ enable-background="new 0 0 124 96"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="textmode-868482.svg"><metadata
+ id="metadata3875"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs3873" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1136"
+ id="namedview3871"
+ showgrid="false"
+ inkscape:zoom="2.4583333"
+ inkscape:cx="-2.4745771"
+ inkscape:cy="47.999999"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><g
+ id="g3853"
+ style="fill:#999999;fill-opacity:1"><g
+ id="g3855"
+ style="fill:#999999;fill-opacity:1"><g
+ id="g3857"
+ style="fill:#999999;fill-opacity:1"><path
+ fill="#868482"
+ d="M55.4,70.8L46.9,49H19.4L11,70.8H2.9L30,2h6.7l27,68.8H55.4z M44.4,41.8l-8-21.2c-1-2.7-2.1-6-3.2-9.9 c-0.7,3-1.7,6.3-3,9.9l-8.1,21.2H44.4z"
+ id="path3859"
+ style="fill:#999999;fill-opacity:1" /><path
+ fill="#868482"
+ d="M66.6,72.8H54.1L45.5,51H20.8l-8.4,21.8H0L28.7,0h9.4L66.6,72.8z M56.8,68.8h4L35.4,4h-1.9l1.7,6.2 c1.1,3.8,2.1,7.1,3.1,9.7l9,24h-28l9.1-23.9c1.2-3.5,2.2-6.7,2.9-9.6L32.8,4h-1.4L5.9,68.8h3.8L18.1,47h30.2L56.8,68.8z M25.1,39.8h16.4l-7-18.5c-0.4-1.1-0.8-2.2-1.2-3.4c-0.4,1.1-0.7,2.2-1.2,3.4L25.1,39.8z"
+ id="path3861"
+ style="fill:#999999;fill-opacity:1" /></g><g
+ id="g3863"
+ style="fill:#999999;fill-opacity:1"><path
+ fill="#868482"
+ d="M116.2,70.8l-1.5-7.3h-0.4c-2.6,3.2-5.1,5.4-7.7,6.5s-5.7,1.7-9.5,1.7c-5.1,0-9.1-1.3-12-3.9 s-4.3-6.4-4.3-11.2c0-10.4,8.3-15.8,24.9-16.3l8.7-0.3v-3.2c0-4-0.9-7-2.6-8.9s-4.5-2.9-8.3-2.9c-4.3,0-9.1,1.3-14.5,3.9l-2.4-6 c2.5-1.4,5.3-2.5,8.3-3.2s6-1.2,9.1-1.2c6.1,0,10.7,1.4,13.6,4.1s4.4,7.1,4.4,13.1v35.1H116.2z M98.7,65.3c4.8,0,8.6-1.3,11.4-4 s4.1-6.4,4.1-11.2v-4.6l-7.8,0.3c-6.2,0.2-10.6,1.2-13.4,2.9S89,53.1,89,56.7c0,2.8,0.9,5,2.6,6.4S95.6,65.3,98.7,65.3z"
+ id="path3865"
+ style="fill:#999999;fill-opacity:1" /><path
+ fill="#868482"
+ d="M97.1,73.8c-5.6,0-10.1-1.5-13.3-4.5c-3.3-3-5-7.3-5-12.7c0-11.6,9-17.8,26.8-18.3l6.8-0.2v-1.3 c0-3.5-0.7-6.1-2.1-7.6c-1.3-1.5-3.6-2.2-6.8-2.2c-4,0-8.6,1.3-13.7,3.7l-1.9,0.9L84,22.1l1.6-0.8c2.7-1.4,5.6-2.6,8.8-3.4 c3.2-0.8,6.4-1.2,9.6-1.2c6.6,0,11.7,1.6,15,4.6c3.4,3.1,5.1,8,5.1,14.5v37.1h-9.4l-1.1-5.3c-2,2-4,3.5-6,4.4 C104.7,73.1,101.2,73.8,97.1,73.8z M103.5,23c4.4,0,7.7,1.2,9.8,3.5c2.1,2.3,3.1,5.7,3.1,10.3V42l-10.7,0.3 c-23,0.7-23,10.9-23,14.3c0,4.3,1.2,7.5,3.7,9.7c2.5,2.3,6.1,3.4,10.6,3.4c3.5,0,6.4-0.5,8.7-1.5c2.2-1,4.6-3,6.9-6l0.6-0.8h2.6 l0.7,1.6l1.2,5.7h2.1V35.8c0-5.4-1.3-9.3-3.8-11.6c-2.6-2.4-6.7-3.5-12.3-3.5c-2.8,0-5.7,0.4-8.6,1.1c-2.2,0.6-4.3,1.3-6.3,2.3 l0.9,2.3C94.9,24.1,99.4,23,103.5,23z M98.7,67.3c-3.5,0-6.4-0.9-8.5-2.7C88,62.8,87,60.1,87,56.7c0-4.3,1.7-7.6,5-9.6 c3.1-1.9,7.8-3,14.4-3.2l9.9-0.4v6.7c0,5.3-1.6,9.6-4.8,12.6C108.3,65.8,104,67.3,98.7,67.3z M112.2,47.6l-5.7,0.2 c-5.8,0.2-10,1.1-12.4,2.6C92,51.8,91,53.8,91,56.7c0,2.2,0.6,3.8,1.9,4.9c1.3,1.1,3.3,1.7,5.8,1.7c4.3,0,7.6-1.1,10-3.4 c2.4-2.3,3.5-5.5,3.5-9.7V47.6z"
+ id="path3867"
+ style="fill:#999999;fill-opacity:1" /></g></g><rect
+ y="88"
+ fill="#868482"
+ width="124"
+ height="8"
+ id="rect3869"
+ style="fill:#999999;fill-opacity:1" /></g><path
+ style="fill:#999999;fill-opacity:1"
+ d="m 0.33220339,72.63421 c 0,-0.155512 11.21134461,-28.667467 28.36096261,-72.12573542 0.143964,-0.36481583 1.481288,-0.50697527 4.733406,-0.50316785 L 37.959322,0.01061345 51.99322,35.862443 c 7.718644,19.718506 14.093085,36.099169 14.165419,36.401472 0.105888,0.442511 -1.021912,0.549644 -5.786164,0.549644 l -5.917684,0 -0.546838,-1.118644 C 53.607192,71.079661 51.634697,66.138911 49.524625,60.715473 l -3.836489,-9.860803 -12.536913,0.09809 -12.536911,0.09809 -4.160608,10.779661 -4.160608,10.779661 -5.9804461,0.112569 c -3.2892456,0.06192 -5.98044651,0.02208 -5.98044651,-0.08853 z M 41.423311,39.559322 c 0.0112,-0.536844 -7.930409,-21.643254 -8.141955,-21.638878 -0.210051,0.0043 -8.141912,21.095451 -8.137865,21.638878 0.003,0.398954 16.271502,0.398954 16.27982,0 z"
+ id="path3877"
+ inkscape:connector-curvature="0" /><path
+ style="fill:#999999;fill-opacity:1"
+ d="m 92.065151,73.149063 c -3.134892,-0.597811 -6.806633,-2.545615 -8.728039,-4.630092 -3.392162,-3.680063 -4.988275,-9.313558 -4.123086,-14.552476 0.655241,-3.967636 1.662266,-6.021269 4.194145,-8.553147 4.290577,-4.290579 10.117905,-6.121781 21.824109,-6.858095 l 7.47634,-0.470258 -0.23843,-2.843927 c -0.31037,-3.702079 -1.57377,-6.208129 -3.6811,-7.301736 -3.65637,-1.897491 -10.292169,-1.160169 -17.463875,1.940458 -1.80721,0.781333 -3.322385,1.379711 -3.367056,1.329729 -0.04467,-0.04998 -0.915507,-2.104434 -1.935193,-4.565451 l -1.853974,-4.474576 2.725673,-1.292565 c 3.14265,-1.490302 7.040665,-2.780454 10.251098,-3.392873 3.029187,-0.577844 10.434727,-0.568505 13.314347,0.01679 7.53165,1.530841 11.84608,6.107198 13.11198,13.90799 0.24028,1.480703 0.41628,10.734302 0.41806,21.980995 l 0.003,19.423728 -4.60617,0 -4.60616,0 -0.46374,-2.493636 c -0.25506,-1.371499 -0.554,-2.583889 -0.6643,-2.694191 -0.11031,-0.110307 -1.04828,0.545637 -2.08439,1.457658 -1.03611,0.91202 -2.66587,2.03679 -3.62169,2.499498 -3.64892,1.766412 -11.019819,2.493295 -15.881619,1.566175 z M 106.05095,61.766929 c 4.32066,-2.196863 6.139,-5.519149 6.14339,-11.224556 l 0.002,-2.949153 -3.76271,0.0081 c -2.06949,0.0044 -5.04407,0.190591 -6.61017,0.413687 -8.020819,1.142591 -10.808919,3.331507 -10.833665,8.505426 -0.02458,5.139533 2.569947,7.10421 8.959187,6.784237 2.870148,-0.143735 3.841638,-0.388564 6.101698,-1.5377 z"
+ id="path3879"
+ inkscape:connector-curvature="0" /><path
+ style="fill:#999999;fill-opacity:1"
+ d="m 0.33220339,92.135593 0,-3.864407 61.83050861,0 61.830508,0 0,3.864407 0,3.864407 -61.830508,0 -61.83050861,0 0,-3.864407 z"
+ id="path3881"
+ inkscape:connector-curvature="0" /></svg> \ No newline at end of file
diff --git a/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/style.qml b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/style.qml
new file mode 100644
index 0000000..9d140d0
--- /dev/null
+++ b/imports/shared/QtQuick/VirtualKeyboard/Styles/automotive/style.qml
@@ -0,0 +1,888 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.VirtualKeyboard 2.1
+import QtQuick.VirtualKeyboard.Styles 2.1
+
+import utils 1.0 as Utils
+
+KeyboardStyle {
+ id: currentStyle
+ readonly property bool compactSelectionList: [InputEngine.Pinyin, InputEngine.Cangjie].indexOf(InputContext.inputEngine.inputMode) !== -1
+ readonly property string fontFamily: Utils.Style.fontFamily
+ readonly property real keyBackgroundMargin: Math.round(13 * scaleHint)
+ readonly property real keyContentMargin: Math.round(45 * scaleHint)
+ readonly property real keyIconScale: scaleHint * 0.6
+ readonly property string resourcePrefix: ""
+
+ readonly property string inputLocale: InputContext.locale
+ property color inputLocaleIndicatorColor: "white"
+ property Timer inputLocaleIndicatorHighlightTimer: Timer {
+ interval: 1000
+ onTriggered: inputLocaleIndicatorColor = "gray"
+ }
+ onInputLocaleChanged: {
+ inputLocaleIndicatorColor = "white"
+ inputLocaleIndicatorHighlightTimer.restart()
+ }
+
+ keyboardDesignWidth: 2560
+ keyboardDesignHeight: 800
+ keyboardRelativeLeftMargin: 114 / keyboardDesignWidth
+ keyboardRelativeRightMargin: 114 / keyboardDesignWidth
+ keyboardRelativeTopMargin: 13 / keyboardDesignHeight
+ keyboardRelativeBottomMargin: 86 / keyboardDesignHeight
+
+ keyboardBackground: Rectangle {
+ color: "black"
+ opacity: 0.9
+ }
+
+ keyPanel: KeyPanel {
+ Rectangle {
+ id: keyBackground
+ radius: Utils.Style.buttonRadius
+ color: "#262a32"
+ anchors.fill: parent
+ anchors.margins: keyBackgroundMargin
+ Text {
+ id: keySmallText
+ text: control.smallText
+ visible: control.smallTextVisible
+ color: "gray"
+ anchors.right: parent.right
+ anchors.top: parent.top
+ anchors.margins: keyContentMargin / 3
+ font {
+ family: fontFamily
+ weight: Utils.Style.fontWeight
+ pixelSize: 38 * scaleHint
+ capitalization: control.uppercased ? Font.AllUppercase : Font.MixedCase
+ }
+ }
+ Text {
+ id: keyText
+ text: control.displayText
+ color: "white"
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ anchors.fill: parent
+ anchors.leftMargin: keyContentMargin
+ anchors.topMargin: control.smallTextVisible ? keyContentMargin * 1.2 : keyContentMargin
+ anchors.rightMargin: keyContentMargin
+ anchors.bottomMargin: control.smallTextVisible ? keyContentMargin * 0.8 : keyContentMargin
+ font {
+ family: fontFamily
+ weight: Utils.Style.fontWeight
+ pixelSize: 52 * scaleHint
+ capitalization: control.uppercased ? Font.AllUppercase : Font.MixedCase
+ }
+ }
+ }
+ states: [
+ State {
+ name: "pressed"
+ when: control.pressed
+ PropertyChanges {
+ target: keyBackground
+ opacity: 0.75
+ }
+ PropertyChanges {
+ target: keyText
+ opacity: 0.5
+ }
+ },
+ State {
+ name: "disabled"
+ when: !control.enabled
+ PropertyChanges {
+ target: keyBackground
+ opacity: 0.75
+ }
+ PropertyChanges {
+ target: keyText
+ opacity: 0.05
+ }
+ }
+ ]
+ }
+
+ backspaceKeyPanel: KeyPanel {
+ Rectangle {
+ id: backspaceKeyBackground
+ radius: Utils.Style.buttonRadius
+ color: "#14161b"
+ anchors.fill: parent
+ anchors.margins: keyBackgroundMargin
+ Image {
+ id: backspaceKeyIcon
+ anchors.centerIn: parent
+ sourceSize.width: 159 * keyIconScale
+ sourceSize.height: 88 * keyIconScale
+ smooth: false
+ source: resourcePrefix + "images/backspace-868482.svg"
+ }
+ }
+ states: [
+ State {
+ name: "pressed"
+ when: control.pressed
+ PropertyChanges {
+ target: backspaceKeyBackground
+ opacity: 0.80
+ }
+ PropertyChanges {
+ target: backspaceKeyIcon
+ opacity: 0.6
+ }
+ },
+ State {
+ name: "disabled"
+ when: !control.enabled
+ PropertyChanges {
+ target: backspaceKeyBackground
+ opacity: 0.8
+ }
+ PropertyChanges {
+ target: backspaceKeyIcon
+ opacity: 0.2
+ }
+ }
+ ]
+ }
+
+ languageKeyPanel: KeyPanel {
+ Rectangle {
+ id: languageKeyBackground
+ radius: Utils.Style.buttonRadius
+ color: "#14161b"
+ anchors.fill: parent
+ anchors.margins: keyBackgroundMargin
+ Image {
+ id: languageKeyIcon
+ anchors.centerIn: parent
+ sourceSize.width: 144 * keyIconScale
+ sourceSize.height: 144 * keyIconScale
+ smooth: false
+ source: resourcePrefix + "images/globe-868482.svg"
+ }
+ }
+ states: [
+ State {
+ name: "pressed"
+ when: control.pressed
+ PropertyChanges {
+ target: languageKeyBackground
+ opacity: 0.80
+ }
+ PropertyChanges {
+ target: languageKeyIcon
+ opacity: 0.75
+ }
+ },
+ State {
+ name: "disabled"
+ when: !control.enabled
+ PropertyChanges {
+ target: languageKeyBackground
+ opacity: 0.8
+ }
+ PropertyChanges {
+ target: languageKeyIcon
+ opacity: 0.2
+ }
+ }
+ ]
+ }
+
+ enterKeyPanel: KeyPanel {
+ Rectangle {
+ id: enterKeyBackground
+ radius: Utils.Style.buttonRadius
+ color: "#14161b"
+ anchors.fill: parent
+ anchors.margins: keyBackgroundMargin
+ Image {
+ id: enterKeyIcon
+ visible: enterKeyText.text.length === 0
+ anchors.centerIn: parent
+ readonly property size enterKeyIconSize: {
+ switch (control.actionId) {
+ case EnterKeyAction.Go:
+ case EnterKeyAction.Send:
+ case EnterKeyAction.Next:
+ case EnterKeyAction.Done:
+ return Qt.size(170, 119)
+ case EnterKeyAction.Search:
+ return Qt.size(148, 148)
+ default:
+ return Qt.size(211, 80)
+ }
+ }
+ sourceSize.width: enterKeyIconSize.width * keyIconScale
+ sourceSize.height: enterKeyIconSize.height * keyIconScale
+ smooth: false
+ source: {
+ switch (control.actionId) {
+ case EnterKeyAction.Go:
+ case EnterKeyAction.Send:
+ case EnterKeyAction.Next:
+ case EnterKeyAction.Done:
+ return resourcePrefix + "images/check-868482.svg"
+ case EnterKeyAction.Search:
+ return resourcePrefix + "images/search-868482.svg"
+ default:
+ return resourcePrefix + "images/enter-868482.svg"
+ }
+ }
+ }
+ Text {
+ id: enterKeyText
+ visible: text.length !== 0
+ text: control.actionId !== EnterKeyAction.None ? "" : control.displayText
+ clip: true
+ fontSizeMode: Text.HorizontalFit
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ color: "#80c342"
+ font {
+ family: fontFamily
+ weight: Utils.Style.fontWeight
+ pixelSize: 44 * scaleHint
+ capitalization: Font.AllUppercase
+ }
+ anchors.fill: parent
+ anchors.margins: Math.round(42 * scaleHint)
+ }
+ }
+ states: [
+ State {
+ name: "pressed"
+ when: control.pressed
+ PropertyChanges {
+ target: enterKeyBackground
+ opacity: 0.80
+ }
+ PropertyChanges {
+ target: enterKeyIcon
+ opacity: 0.6
+ }
+ PropertyChanges {
+ target: enterKeyText
+ opacity: 0.6
+ }
+ },
+ State {
+ name: "disabled"
+ when: !control.enabled
+ PropertyChanges {
+ target: enterKeyBackground
+ opacity: 0.8
+ }
+ PropertyChanges {
+ target: enterKeyIcon
+ opacity: 0.2
+ }
+ PropertyChanges {
+ target: enterKeyText
+ opacity: 0.05
+ }
+ }
+ ]
+ }
+
+ hideKeyPanel: KeyPanel {
+ Rectangle {
+ id: hideKeyBackground
+ radius: Utils.Style.buttonRadius
+ color: "#14161b"
+ anchors.fill: parent
+ anchors.margins: keyBackgroundMargin
+ Image {
+ id: hideKeyIcon
+ anchors.centerIn: parent
+ sourceSize.width: 144 * keyIconScale
+ sourceSize.height: 127 * keyIconScale
+ smooth: false
+ source: resourcePrefix + "images/hidekeyboard-868482.svg"
+ }
+ }
+ states: [
+ State {
+ name: "pressed"
+ when: control.pressed
+ PropertyChanges {
+ target: hideKeyBackground
+ opacity: 0.80
+ }
+ PropertyChanges {
+ target: hideKeyIcon
+ opacity: 0.6
+ }
+ },
+ State {
+ name: "disabled"
+ when: !control.enabled
+ PropertyChanges {
+ target: hideKeyBackground
+ opacity: 0.8
+ }
+ PropertyChanges {
+ target: hideKeyIcon
+ opacity: 0.2
+ }
+ }
+ ]
+ }
+
+ shiftKeyPanel: KeyPanel {
+ Rectangle {
+ id: shiftKeyBackground
+ radius: Utils.Style.buttonRadius
+ color: "#14161b"
+ anchors.fill: parent
+ anchors.margins: keyBackgroundMargin
+ Image {
+ id: shiftKeyIcon
+ anchors.centerIn: parent
+ sourceSize.width: 144 * keyIconScale
+ sourceSize.height: 134 * keyIconScale
+ smooth: false
+ source: resourcePrefix + "images/shift-868482.svg"
+ }
+ states: [
+ State {
+ name: "capslock"
+ when: InputContext.capsLock
+ PropertyChanges {
+ target: shiftKeyBackground
+ color: Utils.Style.colorPink
+ }
+ PropertyChanges {
+ target: shiftKeyIcon
+ source: resourcePrefix + "images/shift-c5d6b6.svg"
+ }
+ },
+ State {
+ name: "shift"
+ when: InputContext.shift
+ PropertyChanges {
+ target: shiftKeyIcon
+ source: resourcePrefix + "images/shift-80c342.png"
+ }
+ }
+ ]
+ }
+ states: [
+ State {
+ name: "pressed"
+ when: control.pressed
+ PropertyChanges {
+ target: shiftKeyBackground
+ opacity: 0.80
+ }
+ PropertyChanges {
+ target: shiftKeyIcon
+ opacity: 0.6
+ }
+ },
+ State {
+ name: "disabled"
+ when: !control.enabled
+ PropertyChanges {
+ target: shiftKeyBackground
+ opacity: 0.8
+ }
+ PropertyChanges {
+ target: shiftKeyIcon
+ opacity: 0.2
+ }
+ }
+ ]
+ }
+
+ spaceKeyPanel: KeyPanel {
+ Rectangle {
+ id: spaceKeyBackground
+ radius: Utils.Style.buttonRadius
+ color: "#14161b"
+ anchors.fill: parent
+ anchors.margins: keyBackgroundMargin
+ Text {
+ id: spaceKeyText
+ text: Qt.locale(InputContext.locale).nativeLanguageName
+ color: currentStyle.inputLocaleIndicatorColor
+ Behavior on color { PropertyAnimation { duration: 250 } }
+ anchors.centerIn: parent
+ font {
+ family: fontFamily
+ weight: Utils.Style.fontWeight
+ pixelSize: 48 * scaleHint
+ }
+ }
+ }
+ states: [
+ State {
+ name: "pressed"
+ when: control.pressed
+ PropertyChanges {
+ target: spaceKeyBackground
+ opacity: 0.80
+ }
+ },
+ State {
+ name: "disabled"
+ when: !control.enabled
+ PropertyChanges {
+ target: spaceKeyBackground
+ opacity: 0.8
+ }
+ }
+ ]
+ }
+
+ symbolKeyPanel: KeyPanel {
+ Rectangle {
+ id: symbolKeyBackground
+ radius: Utils.Style.buttonRadius
+ color: "#14161b"
+ anchors.fill: parent
+ anchors.margins: keyBackgroundMargin
+ Text {
+ id: symbolKeyText
+ text: control.displayText
+ color: "white"
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ anchors.fill: parent
+ anchors.margins: keyContentMargin
+ font {
+ family: fontFamily
+ weight: Utils.Style.fontWeight
+ pixelSize: 44 * scaleHint
+ capitalization: Font.AllUppercase
+ }
+ }
+ }
+ states: [
+ State {
+ name: "pressed"
+ when: control.pressed
+ PropertyChanges {
+ target: symbolKeyBackground
+ opacity: 0.80
+ }
+ PropertyChanges {
+ target: symbolKeyText
+ opacity: 0.6
+ }
+ },
+ State {
+ name: "disabled"
+ when: !control.enabled
+ PropertyChanges {
+ target: symbolKeyBackground
+ opacity: 0.8
+ }
+ PropertyChanges {
+ target: symbolKeyText
+ opacity: 0.2
+ }
+ }
+ ]
+ }
+
+ modeKeyPanel: KeyPanel {
+ Rectangle {
+ id: modeKeyBackground
+ radius: Utils.Style.buttonRadius
+ color: "#1e1b18"
+ anchors.fill: parent
+ anchors.margins: keyBackgroundMargin
+ Text {
+ id: modeKeyText
+ text: control.displayText
+ color: "white"
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ anchors.fill: parent
+ anchors.margins: keyContentMargin
+ font {
+ family: fontFamily
+ weight: Utils.Style.fontWeight
+ pixelSize: 44 * scaleHint
+ capitalization: Font.AllUppercase
+ }
+ }
+ Rectangle {
+ id: modeKeyIndicator
+ implicitHeight: parent.height * 0.1
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ anchors.leftMargin: parent.width * 0.4
+ anchors.rightMargin: parent.width * 0.4
+ anchors.bottomMargin: parent.height * 0.12
+ color: "#80c342"
+ radius: Utils.Style.buttonRadius
+ visible: control.mode
+ }
+ }
+ states: [
+ State {
+ name: "pressed"
+ when: control.pressed
+ PropertyChanges {
+ target: modeKeyBackground
+ opacity: 0.80
+ }
+ PropertyChanges {
+ target: modeKeyText
+ opacity: 0.6
+ }
+ },
+ State {
+ name: "disabled"
+ when: !control.enabled
+ PropertyChanges {
+ target: modeKeyBackground
+ opacity: 0.8
+ }
+ PropertyChanges {
+ target: modeKeyText
+ opacity: 0.2
+ }
+ }
+ ]
+ }
+
+ handwritingKeyPanel: KeyPanel {
+ Rectangle {
+ id: hwrKeyBackground
+ radius: Utils.Style.buttonRadius
+ color: "#35322f"
+ anchors.fill: parent
+ anchors.margins: keyBackgroundMargin
+ Image {
+ id: hwrKeyIcon
+ anchors.centerIn: parent
+ readonly property size hwrKeyIconSize: keyboard.handwritingMode ? Qt.size(124, 96) : Qt.size(156, 104)
+ sourceSize.width: hwrKeyIconSize.width * keyIconScale
+ sourceSize.height: hwrKeyIconSize.height * keyIconScale
+ smooth: false
+ source: resourcePrefix + (keyboard.handwritingMode ? "images/textmode-868482.svg" : "images/handwriting-868482.svg")
+ }
+ }
+ states: [
+ State {
+ name: "pressed"
+ when: control.pressed
+ PropertyChanges {
+ target: hwrKeyBackground
+ opacity: 0.80
+ }
+ PropertyChanges {
+ target: hwrKeyIcon
+ opacity: 0.6
+ }
+ },
+ State {
+ name: "disabled"
+ when: !control.enabled
+ PropertyChanges {
+ target: hwrKeyBackground
+ opacity: 0.8
+ }
+ PropertyChanges {
+ target: hwrKeyIcon
+ opacity: 0.2
+ }
+ }
+ ]
+ }
+
+ characterPreviewMargin: 0
+ characterPreviewDelegate: Item {
+ property string text
+ id: characterPreview
+ Rectangle {
+ id: characterPreviewBackground
+ anchors.fill: parent
+ color: "#262a32"
+ radius: Utils.Style.buttonRadius
+ Text {
+ id: characterPreviewText
+ color: "white"
+ text: characterPreview.text
+ fontSizeMode: Text.HorizontalFit
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ anchors.fill: parent
+ anchors.margins: Math.round(48 * scaleHint)
+ font {
+ family: fontFamily
+ weight: Utils.Style.fontWeight
+ pixelSize: 82 * scaleHint
+ }
+ }
+ }
+ }
+
+ alternateKeysListItemWidth: 99 * scaleHint
+ alternateKeysListItemHeight: 150 * scaleHint
+ alternateKeysListDelegate: Item {
+ id: alternateKeysListItem
+ width: alternateKeysListItemWidth
+ height: alternateKeysListItemHeight
+ Text {
+ id: listItemText
+ text: model.text
+ color: "#262a32"
+ font {
+ family: fontFamily
+ weight: Utils.Style.fontWeight
+ pixelSize: 52 * scaleHint
+ }
+ anchors.centerIn: parent
+ }
+ states: State {
+ name: "current"
+ when: alternateKeysListItem.ListView.isCurrentItem
+ PropertyChanges {
+ target: listItemText
+ color: "white"
+ }
+ }
+ }
+ alternateKeysListHighlight: Rectangle {
+ color: "#262a32"
+ radius: Utils.Style.buttonRadius
+ }
+ alternateKeysListBackground: Rectangle {
+ color: "#14161b"
+ radius: Utils.Style.buttonRadius
+ }
+
+ selectionListHeight: 85 * scaleHint
+ selectionListDelegate: SelectionListItem {
+ id: selectionListItem
+ width: Math.round(selectionListLabel.width + selectionListLabel.anchors.leftMargin * 2)
+ Text {
+ id: selectionListLabel
+ anchors.left: parent.left
+ anchors.leftMargin: Math.round((compactSelectionList ? 50 : 140) * scaleHint)
+ anchors.verticalCenter: parent.verticalCenter
+ text: decorateText(display, wordCompletionLength)
+ color: "#BC6608"
+ font {
+ family: fontFamily
+ weight: Utils.Style.fontWeight
+ pixelSize: 44 * scaleHint
+ }
+ function decorateText(text, wordCompletionLength) {
+ if (wordCompletionLength > 0) {
+ return text.slice(0, -wordCompletionLength) + '<u>' + text.slice(-wordCompletionLength) + '</u>'
+ }
+ return text
+ }
+ }
+ Rectangle {
+ id: selectionListSeparator
+ width: 4 * scaleHint
+ height: 36 * scaleHint
+ radius: 2
+ color: "#35322f"
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.right: parent.left
+ }
+ states: State {
+ name: "current"
+ when: selectionListItem.ListView.isCurrentItem
+ PropertyChanges {
+ target: selectionListLabel
+ color: "white"
+ }
+ }
+ }
+ selectionListBackground: keyboardBackground
+
+ selectionListAdd: Transition {
+ NumberAnimation { property: "y"; from: wordCandidateView.height; duration: 200 }
+ NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 200 }
+ }
+ selectionListRemove: Transition {
+ NumberAnimation { property: "y"; to: -wordCandidateView.height; duration: 200 }
+ NumberAnimation { property: "opacity"; to: 0; duration: 200 }
+ }
+
+ navigationHighlight: Rectangle {
+ color: "transparent"
+ border.color: "yellow"
+ border.width: 5
+ }
+
+ traceInputKeyPanelDelegate: TraceInputKeyPanel {
+ traceMargins: keyBackgroundMargin
+ Rectangle {
+ id: traceInputKeyPanelBackground
+ radius: Utils.Style.buttonRadius
+ color: "#35322f"
+ anchors.fill: parent
+ anchors.margins: keyBackgroundMargin
+ Text {
+ id: hwrInputModeIndicator
+ visible: control.patternRecognitionMode === InputEngine.HandwritingRecoginition
+ text: InputContext.inputEngine.inputMode === InputEngine.Latin ? "Abc" : "123"
+ color: "white"
+ anchors.left: parent.left
+ anchors.top: parent.top
+ anchors.margins: keyContentMargin
+ font {
+ family: fontFamily
+ weight: Utils.Style.fontWeight
+ pixelSize: 44 * scaleHint
+ capitalization: {
+ if (InputContext.capsLock)
+ return Font.AllUppercase
+ if (InputContext.shift)
+ return Font.MixedCase
+ return Font.AllLowercase
+ }
+ }
+ }
+ }
+ Canvas {
+ id: traceInputKeyGuideLines
+ anchors.fill: traceInputKeyPanelBackground
+ opacity: 0.1
+ onPaint: {
+ console.error("PAINT")
+ var ctx = getContext("2d")
+ ctx.lineWidth = 1
+ ctx.strokeStyle = "#BC6608"
+ ctx.clearRect(0, 0, width, height)
+ var i
+ if (control.horizontalRulers) {
+ for (i = 0; i < control.horizontalRulers.length; i++) {
+ ctx.beginPath()
+ ctx.moveTo(0, control.horizontalRulers[i])
+ ctx.lineTo(width, control.horizontalRulers[i])
+ ctx.stroke()
+ }
+ }
+ if (control.verticalRulers) {
+ for (i = 0; i < control.verticalRulers.length; i++) {
+ ctx.beginPath()
+ ctx.moveTo(control.verticalRulers[i], 0)
+ ctx.lineTo(control.verticalRulers[i], height)
+ ctx.stroke()
+ }
+ }
+ }
+ }
+ }
+
+ traceCanvasDelegate: TraceCanvas {
+ id: traceCanvas
+ onAvailableChanged: {
+ if (!available)
+ return
+ var ctx = getContext("2d")
+ if (parent.canvasType === "fullscreen") {
+ ctx.lineWidth = 10
+ ctx.strokeStyle = "#BC6608"
+ } else {
+ ctx.lineWidth = 10 * scaleHint
+ ctx.strokeStyle = "#BC6608"
+ }
+ ctx.lineCap = "round"
+ ctx.fillStyle = ctx.strokeStyle
+ }
+ autoDestroyDelay: 800
+ onTraceChanged: if (trace === null) opacity = 0
+ Behavior on opacity { PropertyAnimation { easing.type: Easing.OutCubic; duration: 150 } }
+ }
+
+ popupListDelegate: SelectionListItem {
+ property real cursorAnchor: popupListLabel.x + popupListLabel.width
+ id: popupListItem
+ width: popupListLabel.width + popupListLabel.anchors.leftMargin * 2
+ height: popupListLabel.height + popupListLabel.anchors.topMargin * 2
+ Text {
+ id: popupListLabel
+ anchors.left: parent.left
+ anchors.top: parent.top
+ anchors.leftMargin: popupListLabel.height / 2
+ anchors.topMargin: popupListLabel.height / 3
+ text: decorateText(display, wordCompletionLength)
+ color: "#5CAA15"
+ font {
+ family: fontFamily
+ weight: Utils.Style.fontWeight
+ pixelSize: Qt.inputMethod.cursorRectangle.height * 0.8
+ }
+ function decorateText(text, wordCompletionLength) {
+ if (wordCompletionLength > 0) {
+ return text.slice(0, -wordCompletionLength) + '<u>' + text.slice(-wordCompletionLength) + '</u>'
+ }
+ return text
+ }
+ }
+ states: State {
+ name: "current"
+ when: popupListItem.ListView.isCurrentItem
+ PropertyChanges {
+ target: popupListLabel
+ color: "black"
+ }
+ }
+ }
+
+ popupListBackground: Item {
+ Rectangle {
+ width: parent.width
+ height: parent.height
+ color: "white"
+ border {
+ width: 1
+ color: "#929495"
+ }
+ }
+ }
+
+ popupListAdd: Transition {
+ NumberAnimation { property: "opacity"; from: 0; to: 1.0; duration: 200 }
+ }
+
+ popupListRemove: Transition {
+ NumberAnimation { property: "opacity"; to: 0; duration: 200 }
+ }
+}
diff --git a/imports/shared/assets/drawable-ldpi/FloatingButton_Active.svg b/imports/shared/assets/drawable-ldpi/FloatingButton_Active.svg
new file mode 100644
index 0000000..ef10835
--- /dev/null
+++ b/imports/shared/assets/drawable-ldpi/FloatingButton_Active.svg
@@ -0,0 +1,41 @@
+<?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"
+ width="390px" height="390px" viewBox="0 0 390 390" style="enable-background:new 0 0 390 390;" xml:space="preserve">
+<style type="text/css">
+ .st0{opacity:0.3;enable-background:new ;}
+ .st1{opacity:0.5;}
+ .st2{fill:#FFFFFF;}
+ .st3{fill:#5CAA15;}
+ .st4{fill:none;}
+</style>
+<g id="Active">
+ <g>
+ <circle class="st0" cx="195" cy="195" r="191"/>
+ <g class="st1">
+ <path class="st2" d="M195,4c105.5,0,191,85.5,191,191s-85.5,191-191,191S4,300.5,4,195S89.5,4,195,4 M195,0
+ c-26.3,0-51.9,5.2-75.9,15.3c-23.2,9.8-44.1,23.9-62,41.8s-32,38.8-41.8,62C5.2,143.1,0,168.7,0,195s5.2,51.9,15.3,75.9
+ c9.8,23.2,23.9,44.1,41.8,62s38.8,32,62,41.8c24,10.2,49.6,15.3,75.9,15.3s51.9-5.2,75.9-15.3c23.2-9.8,44.1-23.9,62-41.8
+ s32-38.8,41.8-62c10.2-24,15.3-49.6,15.3-75.9s-5.2-51.9-15.3-75.9c-9.8-23.2-23.9-44.1-41.8-62s-38.8-32-62-41.8
+ C246.9,5.2,221.3,0,195,0L195,0z"/>
+ </g>
+ </g>
+ <circle class="st3" cx="195" cy="195" r="141"/>
+</g>
+<g id="icon">
+ <g>
+ <g>
+ <path class="st2" d="M155.6,247.3c-10.1,0-18.9-5-23.1-13.6c-10.1-21,5.4-37.4,21.7-54.7c1.2-1.2,2.4-2.5,3.6-3.8
+ c5.3-5.7,5.2-11.5,3.5-14.8c-1.8-3.4-5.5-4.9-10.2-4.2c-16.5,2.6-21.2,26.4-21.2,26.6l-11.9-2.2c0.3-1.3,6.4-32.3,31.2-36.3
+ c9.8-1.6,18.5,2.4,22.7,10.4c4.7,8.9,2.6,20.1-5.3,28.6c-1.2,1.3-2.4,2.6-3.6,3.8c-16.7,17.8-25.9,28.5-19.6,41.4
+ c3.3,6.8,11.1,7.6,16.9,6.3c9.2-2.1,19.8-11.1,19.7-29.5c-0.2-28.1,16.2-41.8,30.2-44.9c14.5-3.2,28.4,3.6,34.7,17
+ c1.3,2.8,2.3,5.4,3.1,8.1c13.3,0.7,25.5,4.3,26,4.4l-3.4,11.5c-0.1,0-9.7-2.8-20.6-3.8c0.5,16.5-8.6,28.9-20.1,34.7
+ c-11.9,6-24,3.8-28.9-5.2c-3.1-5.6-1.9-14.7,2.9-22.5c7.9-13,21.3-17.4,31.5-18.8c-0.4-1.2-0.9-2.4-1.4-3.4
+ c-3.9-8.3-12.2-12.4-21.1-10.4c-9.7,2.2-21,12.1-20.8,33.1c0.2,25.5-15.6,38.1-29,41.3C160.5,247,158,247.3,155.6,247.3z
+ M237.8,197.7c-14,1.5-20.6,8.5-23.4,12.9c-3.3,5.2-3.4,9.8-2.9,10.9c1.6,2.9,7.3,3,13,0.2C235.3,216.2,238.3,206.6,237.8,197.7z
+ "/>
+ </g>
+ <rect x="118" y="144" class="st4" width="156" height="104"/>
+ </g>
+</g>
+</svg>
diff --git a/imports/shared/assets/drawable-ldpi/FloatingButton_Available.svg b/imports/shared/assets/drawable-ldpi/FloatingButton_Available.svg
new file mode 100644
index 0000000..1178c8c
--- /dev/null
+++ b/imports/shared/assets/drawable-ldpi/FloatingButton_Available.svg
@@ -0,0 +1,41 @@
+<?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"
+ width="390px" height="390px" viewBox="0 0 390 390" style="enable-background:new 0 0 390 390;" xml:space="preserve">
+<style type="text/css">
+ .st0{opacity:0.3;enable-background:new ;}
+ .st1{opacity:0.5;}
+ .st2{fill:#FFFFFF;}
+ .st3{fill:#26282A;}
+ .st4{fill:none;}
+</style>
+<g id="Available">
+ <g>
+ <circle class="st0" cx="195" cy="195" r="191"/>
+ <g class="st1">
+ <path class="st2" d="M195,4c105.5,0,191,85.5,191,191s-85.5,191-191,191S4,300.5,4,195S89.5,4,195,4 M195,0
+ c-26.3,0-51.9,5.2-75.9,15.3c-23.2,9.8-44.1,23.9-62,41.8s-32,38.8-41.8,62C5.2,143.1,0,168.7,0,195s5.2,51.9,15.3,75.9
+ c9.8,23.2,23.9,44.1,41.8,62s38.8,32,62,41.8c24,10.2,49.6,15.3,75.9,15.3s51.9-5.2,75.9-15.3c23.2-9.8,44.1-23.9,62-41.8
+ s32-38.8,41.8-62c10.2-24,15.3-49.6,15.3-75.9s-5.2-51.9-15.3-75.9c-9.8-23.2-23.9-44.1-41.8-62s-38.8-32-62-41.8
+ C246.9,5.2,221.3,0,195,0L195,0z"/>
+ </g>
+ </g>
+ <circle class="st3" cx="195" cy="195" r="141"/>
+</g>
+<g id="icon">
+ <g>
+ <g>
+ <path class="st2" d="M155.6,247.3c-10.1,0-18.9-5-23.1-13.6c-10.1-21,5.4-37.4,21.7-54.7c1.2-1.2,2.4-2.5,3.6-3.8
+ c5.3-5.7,5.2-11.5,3.5-14.8c-1.8-3.4-5.5-4.9-10.2-4.2c-16.5,2.6-21.2,26.4-21.2,26.6l-11.9-2.2c0.3-1.3,6.4-32.3,31.2-36.3
+ c9.8-1.6,18.5,2.4,22.7,10.4c4.7,8.9,2.6,20.1-5.3,28.6c-1.2,1.3-2.4,2.6-3.6,3.8c-16.7,17.8-25.9,28.5-19.6,41.4
+ c3.3,6.8,11.1,7.6,16.9,6.3c9.2-2.1,19.8-11.1,19.7-29.5c-0.2-28.1,16.2-41.8,30.2-44.9c14.5-3.2,28.4,3.6,34.7,17
+ c1.3,2.8,2.3,5.4,3.1,8.1c13.3,0.7,25.5,4.3,26,4.4l-3.4,11.5c-0.1,0-9.7-2.8-20.6-3.8c0.5,16.5-8.6,28.9-20.1,34.7
+ c-11.9,6-24,3.8-28.9-5.2c-3.1-5.6-1.9-14.7,2.9-22.5c7.9-13,21.3-17.4,31.5-18.8c-0.4-1.2-0.9-2.4-1.4-3.4
+ c-3.9-8.3-12.2-12.4-21.1-10.4c-9.7,2.2-21,12.1-20.8,33.1c0.2,25.5-15.6,38.1-29,41.3C160.5,247,158,247.3,155.6,247.3z
+ M237.8,197.7c-14,1.5-20.6,8.5-23.4,12.9c-3.3,5.2-3.4,9.8-2.9,10.9c1.6,2.9,7.3,3,13,0.2C235.3,216.2,238.3,206.6,237.8,197.7z
+ "/>
+ </g>
+ <rect x="118" y="144" class="st4" width="156" height="104"/>
+ </g>
+</g>
+</svg>
diff --git a/imports/shared/assets/drawable-ldpi/FloatingButton_Unavailable.svg b/imports/shared/assets/drawable-ldpi/FloatingButton_Unavailable.svg
new file mode 100644
index 0000000..d8149b5
--- /dev/null
+++ b/imports/shared/assets/drawable-ldpi/FloatingButton_Unavailable.svg
@@ -0,0 +1,39 @@
+<?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"
+ width="390px" height="390px" viewBox="0 0 390 390" style="enable-background:new 0 0 390 390;" xml:space="preserve">
+<style type="text/css">
+ .st0{opacity:0.3;enable-background:new ;}
+ .st1{opacity:0.5;}
+ .st2{fill:#FFFFFF;}
+ .st3{fill:none;}
+</style>
+<g id="Unavailable">
+ <g>
+ <circle class="st0" cx="195" cy="195" r="191"/>
+ <g class="st1">
+ <path class="st2" d="M195,4c105.5,0,191,85.5,191,191s-85.5,191-191,191S4,300.5,4,195S89.5,4,195,4 M195,0
+ c-26.3,0-51.9,5.2-75.9,15.3c-23.2,9.8-44.1,23.9-62,41.8s-32,38.8-41.8,62C5.2,143.1,0,168.7,0,195s5.2,51.9,15.3,75.9
+ c9.8,23.2,23.9,44.1,41.8,62s38.8,32,62,41.8c24,10.2,49.6,15.3,75.9,15.3s51.9-5.2,75.9-15.3c23.2-9.8,44.1-23.9,62-41.8
+ s32-38.8,41.8-62c10.2-24,15.3-49.6,15.3-75.9s-5.2-51.9-15.3-75.9c-9.8-23.2-23.9-44.1-41.8-62s-38.8-32-62-41.8
+ C246.9,5.2,221.3,0,195,0L195,0z"/>
+ </g>
+ </g>
+</g>
+<g id="icon">
+ <g>
+ <g>
+ <path class="st2" d="M155.6,247.3c-10.1,0-18.9-5-23.1-13.6c-10.1-21,5.4-37.4,21.7-54.7c1.2-1.2,2.4-2.5,3.6-3.8
+ c5.3-5.7,5.2-11.5,3.5-14.8c-1.8-3.4-5.5-4.9-10.2-4.2c-16.5,2.6-21.2,26.4-21.2,26.6l-11.9-2.2c0.3-1.3,6.4-32.3,31.2-36.3
+ c9.8-1.6,18.5,2.4,22.7,10.4c4.7,8.9,2.6,20.1-5.3,28.6c-1.2,1.3-2.4,2.6-3.6,3.8c-16.7,17.8-25.9,28.5-19.6,41.4
+ c3.3,6.8,11.1,7.6,16.9,6.3c9.2-2.1,19.8-11.1,19.7-29.5c-0.2-28.1,16.2-41.8,30.2-44.9c14.5-3.2,28.4,3.6,34.7,17
+ c1.3,2.8,2.3,5.4,3.1,8.1c13.3,0.7,25.5,4.3,26,4.4l-3.4,11.5c-0.1,0-9.7-2.8-20.6-3.8c0.5,16.5-8.6,28.9-20.1,34.7
+ c-11.9,6-24,3.8-28.9-5.2c-3.1-5.6-1.9-14.7,2.9-22.5c7.9-13,21.3-17.4,31.5-18.8c-0.4-1.2-0.9-2.4-1.4-3.4
+ c-3.9-8.3-12.2-12.4-21.1-10.4c-9.7,2.2-21,12.1-20.8,33.1c0.2,25.5-15.6,38.1-29,41.3C160.5,247,158,247.3,155.6,247.3z
+ M237.8,197.7c-14,1.5-20.6,8.5-23.4,12.9c-3.3,5.2-3.4,9.8-2.9,10.9c1.6,2.9,7.3,3,13,0.2C235.3,216.2,238.3,206.6,237.8,197.7z
+ "/>
+ </g>
+ <rect x="118" y="144" class="st3" width="156" height="104"/>
+ </g>
+</g>
+</svg>
diff --git a/imports/shared/assets/icons/4g-signal-strength.png b/imports/shared/assets/icons/4g-signal-strength.png
new file mode 100644
index 0000000..1a90381
--- /dev/null
+++ b/imports/shared/assets/icons/4g-signal-strength.png
Binary files differ
diff --git a/imports/shared/assets/icons/Built_with_Qt_RGB_logo_white.png b/imports/shared/assets/icons/Built_with_Qt_RGB_logo_white.png
new file mode 100644
index 0000000..38300a2
--- /dev/null
+++ b/imports/shared/assets/icons/Built_with_Qt_RGB_logo_white.png
Binary files differ
diff --git a/imports/shared/assets/icons/CarFocusButton.png b/imports/shared/assets/icons/CarFocusButton.png
new file mode 100644
index 0000000..0b2a167
--- /dev/null
+++ b/imports/shared/assets/icons/CarFocusButton.png
Binary files differ
diff --git a/imports/shared/assets/icons/CarInfo.png b/imports/shared/assets/icons/CarInfo.png
new file mode 100644
index 0000000..ad7f0fd
--- /dev/null
+++ b/imports/shared/assets/icons/CarInfo.png
Binary files differ
diff --git a/imports/shared/assets/icons/FullScreenGradient.png b/imports/shared/assets/icons/FullScreenGradient.png
new file mode 100644
index 0000000..417ad98
--- /dev/null
+++ b/imports/shared/assets/icons/FullScreenGradient.png
Binary files differ
diff --git a/imports/shared/assets/icons/Highlight.png b/imports/shared/assets/icons/Highlight.png
new file mode 100644
index 0000000..5f22e74
--- /dev/null
+++ b/imports/shared/assets/icons/Highlight.png
Binary files differ
diff --git a/imports/shared/assets/icons/MapOverlayEdgeGradient.png b/imports/shared/assets/icons/MapOverlayEdgeGradient.png
new file mode 100644
index 0000000..88d99e8
--- /dev/null
+++ b/imports/shared/assets/icons/MapOverlayEdgeGradient.png
Binary files differ
diff --git a/imports/shared/assets/icons/MiddleMask.png b/imports/shared/assets/icons/MiddleMask.png
new file mode 100644
index 0000000..7112637
--- /dev/null
+++ b/imports/shared/assets/icons/MiddleMask.png
Binary files differ
diff --git a/imports/shared/assets/icons/MusicOverlayGradient.png b/imports/shared/assets/icons/MusicOverlayGradient.png
new file mode 100644
index 0000000..b604a23
--- /dev/null
+++ b/imports/shared/assets/icons/MusicOverlayGradient.png
Binary files differ
diff --git a/imports/shared/assets/icons/MusicOverlayGradient2.png b/imports/shared/assets/icons/MusicOverlayGradient2.png
new file mode 100644
index 0000000..da672eb
--- /dev/null
+++ b/imports/shared/assets/icons/MusicOverlayGradient2.png
Binary files differ
diff --git a/imports/shared/assets/icons/NavRoundmarker.png b/imports/shared/assets/icons/NavRoundmarker.png
new file mode 100644
index 0000000..9841616
--- /dev/null
+++ b/imports/shared/assets/icons/NavRoundmarker.png
Binary files differ
diff --git a/imports/shared/assets/icons/RectangleGradient256x512.png b/imports/shared/assets/icons/RectangleGradient256x512.png
new file mode 100644
index 0000000..f83eb63
--- /dev/null
+++ b/imports/shared/assets/icons/RectangleGradient256x512.png
Binary files differ
diff --git a/imports/shared/assets/icons/SimpleBottomBackground.png b/imports/shared/assets/icons/SimpleBottomBackground.png
new file mode 100644
index 0000000..75f28ce
--- /dev/null
+++ b/imports/shared/assets/icons/SimpleBottomBackground.png
Binary files differ
diff --git a/imports/shared/assets/icons/acautosync-knob-down.png b/imports/shared/assets/icons/acautosync-knob-down.png
new file mode 100644
index 0000000..cf0d6ba
--- /dev/null
+++ b/imports/shared/assets/icons/acautosync-knob-down.png
Binary files differ
diff --git a/imports/shared/assets/icons/acautosync-knob-up.png b/imports/shared/assets/icons/acautosync-knob-up.png
new file mode 100644
index 0000000..1996977
--- /dev/null
+++ b/imports/shared/assets/icons/acautosync-knob-up.png
Binary files differ
diff --git a/imports/shared/assets/icons/back-background.png b/imports/shared/assets/icons/back-background.png
new file mode 100644
index 0000000..5e83e7f
--- /dev/null
+++ b/imports/shared/assets/icons/back-background.png
Binary files differ
diff --git a/imports/shared/assets/icons/back.png b/imports/shared/assets/icons/back.png
new file mode 100644
index 0000000..8edc62c
--- /dev/null
+++ b/imports/shared/assets/icons/back.png
Binary files differ
diff --git a/imports/shared/assets/icons/background-contacts.png b/imports/shared/assets/icons/background-contacts.png
new file mode 100644
index 0000000..ce8ee44
--- /dev/null
+++ b/imports/shared/assets/icons/background-contacts.png
Binary files differ
diff --git a/imports/shared/assets/icons/bluetooth.png b/imports/shared/assets/icons/bluetooth.png
new file mode 100644
index 0000000..7d76c79
--- /dev/null
+++ b/imports/shared/assets/icons/bluetooth.png
Binary files differ
diff --git a/imports/shared/assets/icons/calendar.png b/imports/shared/assets/icons/calendar.png
new file mode 100644
index 0000000..cb95cdb
--- /dev/null
+++ b/imports/shared/assets/icons/calendar.png
Binary files differ
diff --git a/imports/shared/assets/icons/cancel.png b/imports/shared/assets/icons/cancel.png
new file mode 100644
index 0000000..b546ab1
--- /dev/null
+++ b/imports/shared/assets/icons/cancel.png
Binary files differ
diff --git a/imports/shared/assets/icons/car-info.png b/imports/shared/assets/icons/car-info.png
new file mode 100644
index 0000000..b6856f0
--- /dev/null
+++ b/imports/shared/assets/icons/car-info.png
Binary files differ
diff --git a/imports/shared/assets/icons/contacts.png b/imports/shared/assets/icons/contacts.png
new file mode 100644
index 0000000..c9b257c
--- /dev/null
+++ b/imports/shared/assets/icons/contacts.png
Binary files differ
diff --git a/imports/shared/assets/icons/destination-airport.png b/imports/shared/assets/icons/destination-airport.png
new file mode 100644
index 0000000..76a7ee2
--- /dev/null
+++ b/imports/shared/assets/icons/destination-airport.png
Binary files differ
diff --git a/imports/shared/assets/icons/destination-home.png b/imports/shared/assets/icons/destination-home.png
new file mode 100644
index 0000000..6581c9f
--- /dev/null
+++ b/imports/shared/assets/icons/destination-home.png
Binary files differ
diff --git a/imports/shared/assets/icons/destination-work.png b/imports/shared/assets/icons/destination-work.png
new file mode 100644
index 0000000..d7959a6
--- /dev/null
+++ b/imports/shared/assets/icons/destination-work.png
Binary files differ
diff --git a/imports/shared/assets/icons/fandirection-head.png b/imports/shared/assets/icons/fandirection-head.png
new file mode 100644
index 0000000..813d9b1
--- /dev/null
+++ b/imports/shared/assets/icons/fandirection-head.png
Binary files differ
diff --git a/imports/shared/assets/icons/fandirection-headandlegs.png b/imports/shared/assets/icons/fandirection-headandlegs.png
new file mode 100644
index 0000000..008355f
--- /dev/null
+++ b/imports/shared/assets/icons/fandirection-headandlegs.png
Binary files differ
diff --git a/imports/shared/assets/icons/fandirection-knob-down.png b/imports/shared/assets/icons/fandirection-knob-down.png
new file mode 100644
index 0000000..f9663ab
--- /dev/null
+++ b/imports/shared/assets/icons/fandirection-knob-down.png
Binary files differ
diff --git a/imports/shared/assets/icons/fandirection-knob-up.png b/imports/shared/assets/icons/fandirection-knob-up.png
new file mode 100644
index 0000000..cccf882
--- /dev/null
+++ b/imports/shared/assets/icons/fandirection-knob-up.png
Binary files differ
diff --git a/imports/shared/assets/icons/fandirection-legs.png b/imports/shared/assets/icons/fandirection-legs.png
new file mode 100644
index 0000000..82b06b8
--- /dev/null
+++ b/imports/shared/assets/icons/fandirection-legs.png
Binary files differ
diff --git a/imports/shared/assets/icons/fandirection-windshield.png b/imports/shared/assets/icons/fandirection-windshield.png
new file mode 100644
index 0000000..7565f24
--- /dev/null
+++ b/imports/shared/assets/icons/fandirection-windshield.png
Binary files differ
diff --git a/imports/shared/assets/icons/fandirection-windshieldandlegs.png b/imports/shared/assets/icons/fandirection-windshieldandlegs.png
new file mode 100644
index 0000000..c368b20
--- /dev/null
+++ b/imports/shared/assets/icons/fandirection-windshieldandlegs.png
Binary files differ
diff --git a/imports/shared/assets/icons/fandirection.png b/imports/shared/assets/icons/fandirection.png
new file mode 100644
index 0000000..0f47466
--- /dev/null
+++ b/imports/shared/assets/icons/fandirection.png
Binary files differ
diff --git a/imports/shared/assets/icons/jane.png b/imports/shared/assets/icons/jane.png
new file mode 100644
index 0000000..b971522
--- /dev/null
+++ b/imports/shared/assets/icons/jane.png
Binary files differ
diff --git a/imports/shared/assets/icons/john.png b/imports/shared/assets/icons/john.png
new file mode 100644
index 0000000..6099666
--- /dev/null
+++ b/imports/shared/assets/icons/john.png
Binary files differ
diff --git a/imports/shared/assets/icons/music.png b/imports/shared/assets/icons/music.png
new file mode 100644
index 0000000..77bd3df
--- /dev/null
+++ b/imports/shared/assets/icons/music.png
Binary files differ
diff --git a/imports/shared/assets/icons/placeofinterest-charging.png b/imports/shared/assets/icons/placeofinterest-charging.png
new file mode 100644
index 0000000..b3bf6ad
--- /dev/null
+++ b/imports/shared/assets/icons/placeofinterest-charging.png
Binary files differ
diff --git a/imports/shared/assets/icons/placeofinterest-coffee.png b/imports/shared/assets/icons/placeofinterest-coffee.png
new file mode 100644
index 0000000..20bfb4f
--- /dev/null
+++ b/imports/shared/assets/icons/placeofinterest-coffee.png
Binary files differ
diff --git a/imports/shared/assets/icons/placeofinterest-parking.png b/imports/shared/assets/icons/placeofinterest-parking.png
new file mode 100644
index 0000000..922b000
--- /dev/null
+++ b/imports/shared/assets/icons/placeofinterest-parking.png
Binary files differ
diff --git a/imports/shared/assets/icons/placeofinterest-shopping.png b/imports/shared/assets/icons/placeofinterest-shopping.png
new file mode 100644
index 0000000..850d0b5
--- /dev/null
+++ b/imports/shared/assets/icons/placeofinterest-shopping.png
Binary files differ
diff --git a/imports/shared/assets/icons/screencast.png b/imports/shared/assets/icons/screencast.png
new file mode 100644
index 0000000..587f06c
--- /dev/null
+++ b/imports/shared/assets/icons/screencast.png
Binary files differ
diff --git a/imports/shared/assets/icons/search.png b/imports/shared/assets/icons/search.png
new file mode 100644
index 0000000..2c673b5
--- /dev/null
+++ b/imports/shared/assets/icons/search.png
Binary files differ
diff --git a/imports/shared/assets/icons/video-next.png b/imports/shared/assets/icons/video-next.png
new file mode 100644
index 0000000..f529265
--- /dev/null
+++ b/imports/shared/assets/icons/video-next.png
Binary files differ
diff --git a/imports/shared/assets/icons/video-pause.png b/imports/shared/assets/icons/video-pause.png
new file mode 100644
index 0000000..cfe9cc8
--- /dev/null
+++ b/imports/shared/assets/icons/video-pause.png
Binary files differ
diff --git a/imports/shared/assets/icons/video-play.png b/imports/shared/assets/icons/video-play.png
new file mode 100644
index 0000000..8933bb4
--- /dev/null
+++ b/imports/shared/assets/icons/video-play.png
Binary files differ
diff --git a/imports/shared/assets/icons/video-previous.png b/imports/shared/assets/icons/video-previous.png
new file mode 100644
index 0000000..e9aa0de
--- /dev/null
+++ b/imports/shared/assets/icons/video-previous.png
Binary files differ
diff --git a/imports/shared/assets/icons/video.png b/imports/shared/assets/icons/video.png
new file mode 100644
index 0000000..7057d94
--- /dev/null
+++ b/imports/shared/assets/icons/video.png
Binary files differ
diff --git a/imports/shared/assets/icons/wifi-signal-strength.png b/imports/shared/assets/icons/wifi-signal-strength.png
new file mode 100644
index 0000000..61dd6f3
--- /dev/null
+++ b/imports/shared/assets/icons/wifi-signal-strength.png
Binary files differ
diff --git a/imports/shared/controls/AppStackView.qml b/imports/shared/controls/AppStackView.qml
new file mode 100644
index 0000000..d9ec1e1
--- /dev/null
+++ b/imports/shared/controls/AppStackView.qml
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Layouts 1.0
+import QtQuick.Controls 1.0
+import controls 1.0
+import utils 1.0
+
+StackView {
+ id: stack
+
+ delegate: StackViewDelegate {
+ function transitionFinished(properties)
+ {
+ }
+
+ pushTransition: StackViewTransition {
+ id: pushTransition
+ property int duration: 400
+
+
+ PropertyAnimation {
+ target: exitItem
+ property: "x"
+ to: -(2*exitItem.width)
+ duration: pushTransition.duration
+ }
+
+ PropertyAnimation {
+ target: enterItem
+ property: "x"
+ from: 2*enterItem.width
+ to: 0
+ duration: pushTransition.duration
+ }
+ }
+ popTransition: StackViewTransition {
+ id: popTransition
+ property int duration: 250
+
+ PropertyAnimation {
+ target: exitItem
+ property: "x"
+ to: 2*exitItem.width
+ duration: popTransition.duration
+ }
+
+ PropertyAnimation {
+ target: enterItem
+ property: "x"
+ from: -(2*enterItem.width)
+ to: 0
+ duration: popTransition.duration
+ }
+ }
+ }
+ Tracer{}
+}
diff --git a/imports/shared/controls/Button_neptune.qml b/imports/shared/controls/Button_neptune.qml
new file mode 100644
index 0000000..cb01758
--- /dev/null
+++ b/imports/shared/controls/Button_neptune.qml
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Layouts 1.0
+
+import utils 1.0
+
+UIElement {
+ id: root
+ vspan: 2
+
+ property alias text: label.text
+ property string iconName
+ property alias label: label
+ property alias icon: icon
+ property alias pressed: mouseArea.pressed
+
+ property int spacing: Style.padding
+
+ signal pressed
+
+ Rectangle {
+ anchors.fill: parent
+ color: '#000'
+ opacity: 0.85
+
+ Behavior on scale { NumberAnimation {} }
+ }
+
+ Column {
+ id: layout
+
+ anchors.centerIn: parent
+
+ spacing: root.spacing
+
+ Image {
+ id: icon
+
+ source: iconName ? Style.symbol(iconName) : ""
+ anchors.horizontalCenter: parent.horizontalCenter
+ visible: source !== undefined
+ asynchronous: true
+ }
+
+ Label {
+ id: label
+ visible: text
+ opacity: root.enabled ? 1.0 : 0.6
+ horizontalAlignment: Text.AlignHCenter
+ font.pixelSize: Style.fontSizeM
+ scale: mouseArea.pressed?0.85:1.0
+ Behavior on scale { NumberAnimation {} }
+ }
+ }
+
+ MouseArea {
+ id: mouseArea
+
+ anchors.fill: parent
+ onClicked: root.pressed()
+ }
+}
diff --git a/imports/shared/controls/DisplayBackground.qml b/imports/shared/controls/DisplayBackground.qml
new file mode 100644
index 0000000..ab3a11c
--- /dev/null
+++ b/imports/shared/controls/DisplayBackground.qml
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtGraphicalEffects 1.0
+import utils 1.0
+
+Item {
+
+ property string background: Style.displayBackground
+
+ Image {
+ source: Style.symbol("FullScreenGradient")
+
+ }
+}
diff --git a/imports/shared/controls/Icon.qml b/imports/shared/controls/Icon.qml
new file mode 100644
index 0000000..7adb677
--- /dev/null
+++ b/imports/shared/controls/Icon.qml
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import utils 1.0
+
+UIElement {
+ id: root
+ hspan: 2
+ vspan: 2
+
+ property string source
+ property bool fit: false
+
+ Image {
+ id: defaultIcon
+ width: root.fit ? root.width : undefined
+ height: root.fit ? root.height : undefined
+ anchors.centerIn: parent
+ source: root.source ? root.source : ""
+ opacity: root.enabled ? 1.0 : 0.5
+ asynchronous: true
+ fillMode: root.fit ? Image.PreserveAspectFit : Image.Pad
+ Behavior on opacity { NumberAnimation { duration: 250 } }
+ }
+}
diff --git a/imports/shared/controls/Label.qml b/imports/shared/controls/Label.qml
new file mode 100644
index 0000000..4b1ec7f
--- /dev/null
+++ b/imports/shared/controls/Label.qml
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import utils 1.0
+
+Text {
+ id: textElement
+
+ verticalAlignment: Text.AlignVCenter
+ font.family: Style.fontFamily
+ font.weight: Style.fontWeight
+ color: Style.colorWhite
+ clip: Style.debugMode
+ font.pixelSize: Style.fontSizeS
+}
diff --git a/imports/shared/controls/LaunchItemBackground.qml b/imports/shared/controls/LaunchItemBackground.qml
new file mode 100644
index 0000000..e6cf537
--- /dev/null
+++ b/imports/shared/controls/LaunchItemBackground.qml
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt multiscreen demo application.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+import QtApplicationManager 1.0
+import utils 1.0
+
+Item {
+ property alias text: title.text
+ property string applicationName
+ scale: area.pressed?0.85:1.0
+
+ Behavior on scale {
+ NumberAnimation {}
+ }
+
+ Image {
+ source: Style.symbol("RectangleGradient256x512")
+ anchors.fill: parent
+ }
+
+ Label {
+ id: title
+ anchors.left: parent.left
+ anchors.top: parent.top
+ anchors.margins: Style.paddingXXL
+ }
+
+ MouseArea {
+ id: area
+ anchors.fill: parent
+ onClicked: {
+ ApplicationManager.startApplication(applicationName)
+ }
+ }
+}
diff --git a/imports/shared/controls/Slider.qml b/imports/shared/controls/Slider.qml
new file mode 100644
index 0000000..9614290
--- /dev/null
+++ b/imports/shared/controls/Slider.qml
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import utils 1.0
+
+UIElement {
+ id: root;
+ hspan: 7
+ vspan: 2
+ property real value // value is read/write.
+ property real minimum: 0
+ property real maximum: 1
+ property int length: width - handle.width
+ property int timeLineHeight: 15
+ property real activeValue
+
+ function valueToString() {
+ return activeValue.toFixed(2)
+ }
+
+ Rectangle {
+ id: background
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.verticalCenter: parent.verticalCenter
+ height: timeLineHeight
+ radius: 4
+ border.color: Qt.lighter(color, 1.1)
+ color: "#999"
+ opacity: 0.25
+ }
+
+ Rectangle {
+ id: labelRect
+ width: label.width
+ height: label.height + 4
+ radius: 4
+ smooth: true
+ color: "#000"
+ border.color: Qt.lighter(color, 1.1)
+ anchors.bottom: handle.top
+ anchors.bottomMargin: 4
+ x: Math.max(Math.min(handle.x + (handle.width - width )/2, root.width - width),0)
+ visible: area.pressed
+ opacity: 0.75
+
+ Text{
+ id: label
+ color: Style.colorWhite
+ font.family: Style.fontFamily
+ font.pixelSize: Style.fontSizeS
+ text: root.valueToString()
+ width: font.pointSize * 3.5
+ anchors.horizontalCenter: labelRect.horizontalCenter
+ horizontalAlignment: Text.AlignHCenter
+ anchors.baseline: parent.bottom
+ anchors.baselineOffset: -6
+ }
+ }
+
+ Rectangle {
+ id: handle;
+ smooth: true
+ width: handle.x ? 10 : 0
+ y: (root.height - height)/2;
+ x: (root.value - root.minimum) * root.length / (root.maximum - root.minimum)
+
+ height: timeLineHeight; radius: 4
+ border.color: Qt.lighter(color, 1.1)
+ color: Style.colorPink
+
+ MouseArea {
+ id: area
+ hoverEnabled: false
+ anchors.fill: parent; drag.target: parent
+ drag.axis: Drag.XAxis; drag.minimumX: 0; drag.maximumX: root.length
+ onPositionChanged: {
+ root.activeValue = root.minimum + (root.maximum - root.minimum) * handle.x / root.length
+ }
+ }
+ }
+ Rectangle {
+ id: handleTail
+ y: handle.y;
+ radius: handle.radius; color: handle.color
+ anchors.left: background.left
+ anchors.right: handle.right
+ width: handle.x; height: handle.height
+ }
+}
diff --git a/imports/shared/controls/SwipeView.qml b/imports/shared/controls/SwipeView.qml
new file mode 100644
index 0000000..cad2771
--- /dev/null
+++ b/imports/shared/controls/SwipeView.qml
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+import QtQuick 2.1
+
+import utils 1.0
+
+UIElement {
+ id: root
+
+ property alias delegate: pathView.delegate
+ property alias items: pathView.model
+ property alias currentViewIndex: pathView.currentIndex
+
+ property int itemWidth
+
+ PathView {
+ id: pathView
+
+ property int padding: (width-root.itemWidth)/2
+
+ anchors.fill: parent
+ clip: true
+
+ snapMode: PathView.SnapOneItem
+
+ pathItemCount: 3
+
+ preferredHighlightBegin: 0.5
+ preferredHighlightEnd: 0.5
+
+ path: Path {
+ startX: -root.itemWidth+pathView.padding
+ startY: pathView.height/2
+ PathAttribute { name: "scale"; value: 0.5 }
+ PathAttribute { name: "angle"; value: -100 }
+ PathAttribute { name: "z"; value: 0 }
+ PathAttribute { name: "yTranslate"; value: Style.vspan(4) }
+
+ PathLine { x: pathView.width/2; y: pathView.height/2 }
+ PathAttribute { name: "scale"; value: 1 }
+ PathAttribute { name: "angle"; value: 0 }
+ PathAttribute { name: "z"; value: 1 }
+ PathAttribute { name: "yTranslate"; value: 0 }
+
+ PathLine { x: pathView.width + root.itemWidth-pathView.padding; y: pathView.height/2 }
+ PathAttribute { name: "scale"; value: 0.5 }
+ PathAttribute { name: "angle"; value: 100 }
+ PathAttribute { name: "z"; value: 0 }
+ PathAttribute { name: "yTranslate"; value: Style.vspan(4) }
+ }
+ }
+}
diff --git a/imports/shared/controls/Symbol.qml b/imports/shared/controls/Symbol.qml
new file mode 100644
index 0000000..ed1717a
--- /dev/null
+++ b/imports/shared/controls/Symbol.qml
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import utils 1.0
+
+Item {
+ id: root
+ implicitHeight: image.height
+ implicitWidth: image.width
+
+ signal activeSymbolChanged()
+
+ property string name
+ property bool active
+ property int size: Style.defaultSymbolSize
+ property alias rotate: image.rotation
+ Image {
+ id: image
+ anchors.centerIn: parent
+ source: root.name ? Style.symbol(root.name, root.active) : ""
+ asynchronous: true
+ }
+}
diff --git a/imports/shared/controls/Tool.qml b/imports/shared/controls/Tool.qml
new file mode 100644
index 0000000..d5b6af2
--- /dev/null
+++ b/imports/shared/controls/Tool.qml
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import controls 1.0
+import utils 1.0
+
+UIElement {
+ id: root
+ hspan: 1
+ vspan: 2
+ property alias name: icon.name
+ property alias size: icon.size
+ property bool active
+ scale: area.pressed ? 1.1 : 1.0
+ Behavior on scale { NumberAnimation { duration: 25 } }
+
+ signal clicked()
+
+ function toggle() {
+ active = !active
+ }
+
+ Symbol {
+ id: icon
+ anchors.fill: parent
+ active: area.pressed || root.active
+ opacity: 0.75
+ }
+
+ MouseArea {
+ id: area
+ anchors.fill: parent
+ onClicked: root.clicked()
+ }
+}
diff --git a/imports/shared/controls/qmldir b/imports/shared/controls/qmldir
new file mode 100644
index 0000000..3a052d2
--- /dev/null
+++ b/imports/shared/controls/qmldir
@@ -0,0 +1,14 @@
+Icon 1.0 Icon.qml
+Label 1.0 Label.qml
+Button_neptune 1.0 Button_neptune.qml
+DisplayBackground 1.0 DisplayBackground.qml
+TabView 1.0 TabView.qml
+Tool 1.0 Tool.qml
+TextTool 1.0 TextTool.qml
+Slider 1.0 Slider.qml
+Symbol 1.0 Symbol.qml
+AppStackView 1.0 AppStackView.qml
+SwipeView 1.0 SwipeView.qml
+LetterPicker 1.0 LetterPicker.qml
+Title 1.0 Title.qml
+LaunchItemBackground 1.0 LaunchItemBackground.qml
diff --git a/imports/shared/service/climate/ClimateService.qml b/imports/shared/service/climate/ClimateService.qml
new file mode 100644
index 0000000..ffdf71b
--- /dev/null
+++ b/imports/shared/service/climate/ClimateService.qml
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+pragma Singleton
+import QtQuick 2.0
+import QtIvi.VehicleFunctions 1.0
+import service.settings 1.0
+
+QtObject {
+ id: root
+
+ property ClimateControl climateControl: ClimateControl {
+ discoveryMode: ClimateControl.AutoDiscovery
+ }
+
+ property QtObject leftSeat: QtObject {
+ property real minValue: calculateUnitValue(16)
+ property real maxValue: calculateUnitValue(28)
+ property real stepValue: calculateUnitValue(0.5)
+ property real value: calculateUnitValue(climateControl.zoneAt.FrontLeft.targetTemperature.value)
+ property bool heat: climateControl.zoneAt.FrontLeft.seatHeater
+ }
+
+ property QtObject rightSeat: QtObject {
+ property real minValue: calculateUnitValue(16)
+ property real maxValue: calculateUnitValue(28)
+ property real stepValue: calculateUnitValue(0.5)
+ property real value: calculateUnitValue(climateControl.zoneAt.FrontRight.targetTemperature.value)
+
+ property bool heat: climateControl.zoneAt.FrontRight.seatHeater
+
+ onValueChanged: climateControl.zoneAt.FrontRight.targetTemperature.value = value
+ onHeatChanged: climateControl.zoneAt.FrontRight.seatHeater.value = heat
+ }
+
+ property QtObject frontHeat: QtObject {
+ property string symbol: "front"
+ property bool enabled: true
+ }
+
+ property QtObject rearHeat: QtObject {
+ property string symbol: "rear"
+ property bool enabled: true
+ }
+
+ property QtObject airCondition: QtObject {
+ property string symbol: "ac"
+ property bool enabled: climateControl.airConditioning.value
+
+ onEnabledChanged: {
+ climateControl.airConditioning.value = enabled;
+ enabled = Qt.binding(function() { return climateControl.airConditioning.value; });
+ }
+ }
+
+ property QtObject airflow: QtObject {
+ property int windshield: ClimateControl.Windshield
+ property int dashboard: ClimateControl.Dashboard
+ property int floor: ClimateControl.Floor
+ property int value: climateControl.airflowDirections.value
+ property var availableValues: climateControl.airflowDirections.availableValues
+ }
+
+ property QtObject airQuality: QtObject {
+ property string symbol: "air_quality"
+ property bool enabled: climateControl.recirculationMode.value == ClimateControl.RecirculationOn
+
+ onEnabledChanged: {
+ climateControl.recirculationMode.value = enabled ? ClimateControl.RecirculationOn : ClimateControl.RecirculationOff;
+ enabled = Qt.binding(function() { return climateControl.recirculationMode.value == ClimateControl.RecirculationOn });
+ }
+ }
+
+ property QtObject eco: QtObject {
+ property string symbol: "eco"
+ property bool enabled: false
+ }
+
+ property QtObject steeringWheelHeat: QtObject {
+ property string symbol: "stearing_wheel"
+ property bool enabled: climateControl.steeringWheelHeater.value >= 5
+
+ onEnabledChanged: {
+ climateControl.steeringWheelHeater.value = enabled ? 10 : 0;
+ enabled = Qt.binding(function() { return climateControl.steeringWheelHeater.value >= 5 });
+ }
+ }
+
+ property var climateOptions: [frontHeat, rearHeat, airCondition, airQuality, eco, steeringWheelHeat]
+
+ property int outsideTemp: calculateUnitValue(15)
+ property string outsideTempText: qsTr("%1" + tempSuffix).arg(outsideTemp)
+ property int ventilation: climateControl.fanSpeedLevel.value
+ property string tempSuffix: SettingsService.metric ? "°C" : "°F"
+ property int ventilationLevels: climateControl.fanSpeedLevel.maximumValue // 6 + off (0)
+ onVentilationChanged: climateControl.fanSpeedLevel.value = ventilation
+
+ property QtObject stateMachine: ClimateStateMachine {
+ climateControl: root.climateControl
+ doorsOpen: eco.enabled // TODO use QtIVI doors/window state for this eventually
+ }
+
+ function calculateUnitValue(value) {
+ // Defualt value is the celsius
+ return (SettingsService.unitSystem === "metric") ? value : (Math.round(value * 1.8 + 32))
+ }
+}
diff --git a/imports/shared/service/climate/ClimateStateMachine.qml b/imports/shared/service/climate/ClimateStateMachine.qml
new file mode 100644
index 0000000..596be08
--- /dev/null
+++ b/imports/shared/service/climate/ClimateStateMachine.qml
@@ -0,0 +1,169 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQml.StateMachine 1.0 as DSM
+import QtIvi.VehicleFunctions 1.0
+
+QtObject {
+ id: root
+ property ClimateControl climateControl
+ property bool doorsOpen: false
+
+ property QtObject stateMachine: DSM.StateMachine {
+ id: climateStateMachine
+ running: true
+ initialState: runningState
+
+ DSM.State {
+ childMode: DSM.State.ParallelStates
+ id: runningState
+
+ DSM.State {
+ id: suspendable
+ initialState: doorsClosedState
+
+ DSM.State {
+ id: doorsClosedState
+ childMode: DSM.State.ParallelStates
+
+ DSM.State {
+ id: airConditionState
+ initialState: climateControl.airConditioning.value ? airConditionOn : airConditionOff
+
+ DSM.State {
+ id: airConditionOff
+ onEntered: climateControl.airConditioning.value = false
+ DSM.SignalTransition {
+ targetState: airConditionOn
+ signal: climateControl.airConditioning.valueChanged
+ guard: climateControl.airConditioning.value
+ }
+ }
+
+ DSM.State {
+ id: airConditionOn
+ onEntered: {
+ climateControl.airConditioning.value = true
+ steeringWheelHeat.enabled = false
+ }
+ DSM.SignalTransition {
+ targetState: airConditionOff
+ signal: climateControl.airConditioning.valueChanged
+ guard: !climateControl.airConditioning.value
+ }
+ }
+ } // airConditionState
+
+ DSM.State {
+ id: airRecirculationState
+ initialState: climateControl.recirculation.value ? airRecirculationOn : airRecirculationOff
+
+ DSM.State {
+ id: airRecirculationOff
+ onEntered: climateControl.recirculationMode.value = ClimateControl.RecirculationOff
+ DSM.SignalTransition {
+ targetState: airRecirculationOn
+ signal: climateControl.recirculationMode.valueChanged
+ guard: climateControl.recirculationMode.value == ClimateControl.RecirculationOn
+ }
+ }
+
+ DSM.State {
+ id: airRecirculationOn
+ onEntered: {
+ climateControl.recirculationMode.value = ClimateControl.RecirculationOn
+ }
+ DSM.SignalTransition {
+ targetState: airRecirculationOff
+ signal: climateControl.recirculationMode.valueChanged
+ guard: climateControl.recirculationMode.value == ClimateControl.RecirculationOff
+ }
+ }
+ } // airRecirculationState
+
+ DSM.HistoryState {
+ id: historyState
+ defaultState: doorsClosedState
+ historyType: DSM.HistoryState.DeepHistory
+ }
+
+ DSM.SignalTransition {
+ targetState: suspended
+ signal: doorsOpenChanged
+ guard: doorsOpen
+ }
+ } // door closed state
+
+ DSM.State {
+ id: suspended
+ onEntered: {
+ climateControl.airConditioning.value = false
+ climateControl.recirculationMode.value = ClimateControl.RecirculationOff
+ }
+ DSM.SignalTransition {
+ targetState: historyState
+ signal: doorsOpenChanged
+ guard: !doorsOpen
+ }
+ }
+
+ } // suspendable state
+
+ DSM.State {
+ id: steeringWheelHeatState
+ initialState: (climateControl.steeringWheelHeater.value >= 5) ? steeringWheelHeatOn : steeringWheelHeatOff
+
+ DSM.State {
+ id: steeringWheelHeatOff
+ onEntered: climateControl.steeringWheelHeater.value = 0
+ DSM.SignalTransition {
+ targetState: steeringWheelHeatOn
+ signal: climateControl.steeringWheelHeater.valueChanged
+ guard: climateControl.steeringWheelHeater.value >= 5
+ }
+ }
+
+ DSM.State {
+ id: steeringWheelHeatOn
+ onEntered: {
+ climateControl.steeringWheelHeater.value = 10
+ climateControl.airConditioning.value = false
+ }
+ DSM.SignalTransition {
+ targetState: steeringWheelHeatOff
+ signal: climateControl.steeringWheelHeater.valueChanged
+ guard: climateControl.steeringWheelHeater.value < 5
+ }
+ }
+ }
+ } // running state
+ }
+}
diff --git a/imports/shared/service/climate/qmldir b/imports/shared/service/climate/qmldir
new file mode 100644
index 0000000..322284f
--- /dev/null
+++ b/imports/shared/service/climate/qmldir
@@ -0,0 +1 @@
+singleton ClimateService 1.0 ClimateService.qml
diff --git a/imports/shared/service/movie/MovieService.qml b/imports/shared/service/movie/MovieService.qml
new file mode 100644
index 0000000..0e9655b
--- /dev/null
+++ b/imports/shared/service/movie/MovieService.qml
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+pragma Singleton
+
+import QtQuick 2.0
+import "." 1.0
+
+QtObject {
+ id: root
+ property var movieProvider
+ property int currentIndex: 0
+ property int trackCount
+ property var currentTrack
+
+
+ function nextTrack() {
+ if (movieProvider)
+ movieProvider.next()
+ }
+
+ function previousTrack() {
+ if (movieProvider)
+ movieProvider.previous()
+ }
+
+ function sourcePath(source) {
+ return movieProvider ? movieProvider.sourcePath(source) : ""
+ }
+
+
+ function coverPath(cover) {
+ return movieProvider ? movieProvider.coverPath(cover) : ""
+ }
+
+ function selectRandomTracks() {
+ if (movieProvider)
+ movieProvider.selectRandom()
+ }
+}
diff --git a/imports/shared/service/movie/qmldir b/imports/shared/service/movie/qmldir
new file mode 100644
index 0000000..764d674
--- /dev/null
+++ b/imports/shared/service/movie/qmldir
@@ -0,0 +1 @@
+singleton MovieService 1.0 MovieService.qml
diff --git a/imports/shared/service/music/MusicService.qml b/imports/shared/service/music/MusicService.qml
new file mode 100644
index 0000000..22e858b
--- /dev/null
+++ b/imports/shared/service/music/MusicService.qml
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+pragma Singleton
+import QtQuick 2.0
+import QtMultimedia 5.0
+import "." 1.0
+
+QtObject {
+ id: root
+
+ property string defaultMusicApp: "com.pelagicore.media"
+ property var musicProvider
+ property Audio player: Audio {
+ id: player
+ source: currentTrack ? root.url : ""
+ onVolumeChanged: {
+ print('volume: ' + volume)
+ }
+ onStatusChanged: {
+ if (status == Audio.EndOfMedia)
+ nextTrack()
+ }
+ }
+
+ property alias volume: player.volume
+
+ property int currentIndex
+ property int trackCount
+ property var currentTrack
+ property string coverPath
+ property bool playing: player.playbackState === Audio.PlayingState
+ property alias duration: player.duration
+ property alias position: player.position
+ property string currentTime: Qt.formatTime(new Date(position), 'mm:ss')
+ property string durationTime: Qt.formatTime(new Date(duration), 'mm:ss')
+ property int remaining: player.duration - player.position
+ property string remainingTime: Qt.formatTime(new Date(remaining), 'mm:ss')
+ property string url
+
+ function musicPlay() {
+ player.source = Qt.binding(function() { return currentTrack ? root.url : ""})
+ play()
+ }
+
+ function play() {
+ print('MusicService.play: ' + player.source)
+ player.autoPlay = true
+ player.play()
+ }
+
+ function pause() {
+ print('MusicService.pause: ' + player.source)
+ player.autoPlay = false
+ player.pause()
+ }
+
+ function togglePlay() {
+ if (playing) {
+ pause()
+ } else {
+ play()
+ }
+ }
+
+ function nextTrack() {
+ if (root.musicProvider)
+ root.musicProvider.next()
+ }
+
+ function previousTrack() {
+ if (root.musicProvider)
+ root.musicProvider.previous()
+ }
+
+ function selectAllAlbums() {
+ provider.query = 'select distinct album, cover, artist from music'
+ }
+
+ function seek(value) {
+ player.seek(value)
+ }
+
+ Component.onDestruction: {
+ // required to avoid crashing qmllive
+ player.autoLoad = false
+ player.autoPlay = false
+ player.stop()
+ player.source = ''
+ }
+}
diff --git a/imports/shared/service/music/qmldir b/imports/shared/service/music/qmldir
new file mode 100644
index 0000000..3ca99e6
--- /dev/null
+++ b/imports/shared/service/music/qmldir
@@ -0,0 +1 @@
+singleton MusicService 1.0 MusicService.qml
diff --git a/imports/shared/service/settings/SettingsService.qml b/imports/shared/service/settings/SettingsService.qml
new file mode 100644
index 0000000..10577bc
--- /dev/null
+++ b/imports/shared/service/settings/SettingsService.qml
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+pragma Singleton
+import QtQuick 2.1
+
+QtObject {
+ id: root
+
+ property bool clusterVisible: true
+ property string unitSystem: "metric" // "metric" or "imp_us"
+ property bool metric: unitSystem === "metric"
+
+ property ListModel entries: ListModel {
+ ListElement { title: "USER PROFILE"; icon: "profile"; checked: true; hasChildren: true }
+ ListElement { title: "SERVICE & SUPPORT"; icon: "service"; checked: false; hasChildren: false }
+ ListElement { title: "TRAFFIC INFORMATION"; icon: "warning"; checked: true; hasChildren: true }
+ ListElement { title: "TOLL & CONGESTION FEES"; icon: "toll"; checked: false; hasChildren: true }
+ ListElement { title: "METRIC SYSTEM"; icon: "fees"; checked: true; hasChildren: false }
+ ListElement { title: "APP UPDATES"; icon: "updates"; checked: true; hasChildren: true }
+ ListElement { title: "INSURANCE FEATURES"; icon: "insurance"; checked: true; hasChildren: true }
+ }
+
+ property var carSettings: [
+ { section: "Units", option: clockOption },
+ { section: "Units", option: speedOption },
+ { section: "Communication", option: bluetoothOption }
+ ]
+
+ property var clockOption: QtObject {
+ property string format: active === 0 ? "hh:mm" : "h:mm AP"
+ property var options: ['24H', 'AM/PM']
+ property string name: "Time"
+ property int active: 0
+
+ function setActive(index) { active = index }
+ }
+
+ property var speedOption: QtObject {
+ property var options: ['KMH', 'MPH']
+ property string name: "Speed"
+ property int active: 0
+
+ function setActive(index) { active = index }
+ }
+
+ property var bluetoothOption: QtObject {
+
+ property string name: "Bluetooth"
+ property bool active: false
+
+ function setActive(value) { active = value }
+ }
+
+ property ListModel functions: ListModel {
+ ListElement {
+ description: "Hill descent control"
+ icon: "hill_descent_control"
+ active: true
+ }
+ ListElement {
+ description: "Intelligent speed adaptation"
+ icon: "intelligent_speed_adaptation"
+ active: false
+ }
+ ListElement {
+ description: "Automatic beam switching"
+ icon: "automatic_beam_switching"
+ active: true
+ }
+ ListElement {
+ description: "Collision avoidance"
+ icon: "collision_avoidance"
+ active: false
+ }
+ ListElement {
+ description: "Lane keeping assist"
+ icon: "lane_keeping_assist"
+ active: false
+ }
+ ListElement {
+ description: "Traffic jam assist"
+ icon: "traffic_jam_assist"
+ active: false
+ }
+ ListElement {
+ description: "Driver drowsyness alert"
+ icon: "driver_drownsyness_alert"
+ active: true
+ }
+ ListElement {
+ description: "Park assist"
+ icon: "park_assist"
+ active: false
+ }
+ }
+}
diff --git a/imports/shared/service/settings/qmldir b/imports/shared/service/settings/qmldir
new file mode 100644
index 0000000..950972f
--- /dev/null
+++ b/imports/shared/service/settings/qmldir
@@ -0,0 +1 @@
+singleton SettingsService 1.0 SettingsService.qml
diff --git a/imports/shared/service/statusbar/StatusBarService.qml b/imports/shared/service/statusbar/StatusBarService.qml
new file mode 100644
index 0000000..e14bc30
--- /dev/null
+++ b/imports/shared/service/statusbar/StatusBarService.qml
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+pragma Singleton
+import QtQuick 2.0
+import service.settings 1.0
+
+Item {
+ id: root
+
+ property string clusterTitle: ""
+ property int pageIndicatorSize: 3
+ property int currentPage: 0
+
+ property var indicators: [
+ { name: "4g-signal-strength", active: true },
+ { name: "bluetooth", active: SettingsService.bluetoothOption.active },
+ { name: "wifi-signal-strength", active: true }
+ ]
+
+ property var currentDate: new Date();
+
+ Timer {
+ interval: 1000
+ repeat: true
+ running: true
+ onTriggered: {
+ currentDate = new Date()
+ }
+ }
+
+ visible: false
+}
diff --git a/imports/shared/service/statusbar/qmldir b/imports/shared/service/statusbar/qmldir
new file mode 100644
index 0000000..129171d
--- /dev/null
+++ b/imports/shared/service/statusbar/qmldir
@@ -0,0 +1 @@
+singleton StatusBarService 1.0 StatusBarService.qml
diff --git a/imports/shared/service/valuesource/ValueSource.qml b/imports/shared/service/valuesource/ValueSource.qml
new file mode 100644
index 0000000..a534903
--- /dev/null
+++ b/imports/shared/service/valuesource/ValueSource.qml
@@ -0,0 +1,282 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+pragma Singleton
+import QtQuick 2.6
+import com.qtcompany.clusterdemodata 1.0
+
+Item {
+ id: valueSource
+ property real kph: 0
+ property real consumeKW: 0
+ property real maxConsumeKWValue: 90
+ property real maxChargeKWValue: 40
+ property real chargeKW: 0
+ property real maxRange: 600
+ property real range: (batteryLevel / 100) * maxRange
+
+ property string destination: "Ernst-Reuter-Platz"
+ property string currentLocation: "Kurt-Schumacher-Damm"
+
+ property var consumption: [300, 600, 700, 800, 900, 700, 600, 300, 50, 50, -100, 50, -100, -150,
+ -200, 50, 150, 200, 300, 200, 300, 200, 500, 50, -100, -100, -150, -80, 50, 300, 600, 700, 800,
+ 600, 700, 300, 50, 50]
+
+ property var turnSignal
+ property var currentDate: new Date()
+ //property string date: currentDate.toLocaleDateString(Qt.locale("fi_FI"), "ddd d. MMM")
+ //property string time: currentDate.toLocaleTimeString(Qt.locale("fi_FI"), "hh:mm")
+ property string date: currentDate.toLocaleDateString(Qt.locale("en_GB"))
+ property string time: currentDate.toLocaleTimeString(Qt.locale("en_GB"), "hh:mm")
+
+ ClusterData {
+ id: clusterDataSource
+
+ onVehicleSpeedChanged: {
+ kph = vehicleSpeed
+ }
+ property int notLeft: ~Qt.LeftArrow
+ property int notRight: ~Qt.RightArrow
+ onLeftTurnLightChanged: leftTurnLight ? turnSignal |= Qt.LeftArrow
+ : turnSignal &= notLeft
+ onRightTurnLightChanged: rightTurnLight ? turnSignal |= Qt.RightArrow
+ : turnSignal &= notRight
+ }
+
+ property real latitude: clusterDataSource.latitude
+ property real longitude: clusterDataSource.longitude
+ property real direction: clusterDataSource.direction
+ property bool lowBeam: automaticDemoMode//clusterDataSource.headLight
+ property int carId: clusterDataSource.carId
+ property bool lightFailure: clusterDataSource.lightFailure
+ property bool flatTire: clusterDataSource.flatTire
+
+ property bool frontLeftOpen: clusterDataSource.zoneAt.frontLeft.doorOpen
+ property bool frontRightOpen: clusterDataSource.zoneAt.frontRight.doorOpen
+ property bool rearLeftDoorOpen: clusterDataSource.zoneAt.rearLeft.doorOpen
+ property bool rearRighDoorOpen: clusterDataSource.zoneAt.rearRight.doorOpen
+ property bool hoodOpen: clusterDataSource.zoneAt.hood.doorOpen
+ property bool trunkOpen: clusterDataSource.zoneAt.trunk.doorOpen
+
+ property double batteryLevel: clusterDataSource.batteryPotential
+ property double fuelLevel: clusterDataSource.gasLevel
+ property int gear: clusterDataSource.gear
+ property bool parkingBrake: clusterDataSource.brake
+ // TODO: These two are hacks. View change messages might not come through CAN.
+ property bool viewChange: clusterDataSource.oilTemp
+ property bool rightViewChange: clusterDataSource.oilPressure
+
+ //
+ // ENABLE FOR FULLY AUTOMATIC DEMO MODE (in case there is no CanController)
+ //
+ property bool automaticDemoMode: true
+ property bool startAnimations: false
+
+ onAutomaticDemoModeChanged: {
+ if (startAnimations) {
+ kph = 0
+ if (automaticDemoMode) {
+ animation.start()
+ } else {
+ gear = 1
+ parkingBrake = false
+ animation.stop()
+ }
+ }
+ }
+
+ onStartAnimationsChanged: {
+ if (startAnimations)
+ animation.start()
+ }
+
+ //
+ // Speed animations for automatic demo mode
+ //
+ Timer {
+ running: startAnimations && automaticDemoMode
+ property bool turnLeft: true
+ repeat: true
+ interval: 7500
+ onTriggered: {
+ turnLeft = !turnLeft
+ if (turnLeft)
+ turnSignal = Qt.LeftArrow
+ else
+ turnSignal = Qt.RightArrow
+ stopSignaling.restart()
+ }
+ }
+
+ Timer {
+ id: stopSignaling
+ running: false
+ interval: 2750
+ onTriggered: turnSignal = Qt.NoArrow
+ }
+
+ Behavior on fuelLevel {
+ enabled: automaticDemoMode
+ PropertyAnimation {
+ duration: 18000
+ }
+ }
+
+ Behavior on batteryLevel {
+ enabled: automaticDemoMode
+ PropertyAnimation {
+ duration: 18000
+ }
+ }
+
+ onFuelLevelChanged: {
+ if (automaticDemoMode && fuelLevel <= 5)
+ fuelLevel = 100
+ }
+
+ onBatteryLevelChanged: {
+ if (automaticDemoMode && batteryLevel <= 5)
+ batteryLevel = 100
+ }
+
+ SequentialAnimation {
+ id: animation
+ running: false
+ loops: Animation.Infinite
+
+ ScriptAction {
+ script: {
+ gear = 0
+ parkingBrake = true
+ }
+ }
+ PauseAnimation { duration: 2000 }
+ ScriptAction {
+ script: {
+ parkingBrake = false
+ gear = 1
+ fuelLevel -= 10.
+ batteryLevel -= 10.
+ }
+ }
+ PropertyAnimation {
+ target: valueSource
+ property: "kph"
+ from: 0
+ to: 150
+ duration: 10000
+ }
+ PropertyAnimation {
+ target: valueSource
+ property: "kph"
+ from: 150
+ to: 120
+ duration: 500
+ }
+ PropertyAnimation {
+ target: valueSource
+ property: "kph"
+ from: 120
+ to: 200
+ duration: 1500
+ }
+ PropertyAnimation {
+ target: valueSource
+ property: "kph"
+ from: 200
+ to: 0
+ duration: 6000
+ }
+ }
+
+ // In normal Car UI mode only speed is animated based on gps data
+ // In automatic demo mode rpm, turbo, consumption and engine temperature are based on speed
+ //property int rpm: automaticDemoMode ? kph * 40 : kph * 150
+ //property double engineTemperature: automaticDemoMode ? kph * .25 + 60. : kph * .5 + 50.
+ // New route is faster, we can use the same values for both modes
+ property int rpm: kph * 40
+ property double engineTemperature: kph * .22 + 60.
+
+ property int totalDistance: 42300
+ property int kmSinceCharge: 8
+ property int avRangePerCharge: 425
+ property int energyPerKm: 324
+
+ property real totalDistanceSince: 0.
+
+ property string gearString: {
+ var g
+ if (gear === 0 || gear < -1)
+ return "N"
+ else if (gear === -1)
+ return "R"
+ else if (carId === 1) //sports car
+ return gear.toString()
+ else
+ return "D"
+ }
+
+ Timer {
+ id: timeTimer
+ interval: 15000
+ repeat: true
+ running: true
+ onTriggered: {
+ currentDate = new Date()
+ //date = currentDate.toLocaleDateString(Qt.locale("fi_FI"), "ddd d. MMM")
+ //time = currentDate.toLocaleTimeString(Qt.locale("fi_FI"), "hh:mm")
+ date = currentDate.toLocaleDateString(Qt.locale("en_GB"))
+ time = currentDate.toLocaleTimeString(Qt.locale("en_GB"), "hh:mm")
+ // Approximate total distance based on current speed
+ totalDistanceSince += kph / 240. // = km / 15 min
+ if (totalDistanceSince > 1.) {
+ var totalInt = Math.floor(totalDistanceSince)
+ totalDistance += totalInt
+ kmSinceCharge += totalInt
+ totalDistanceSince -= totalInt
+ }
+ }
+ }
+
+ Behavior on kph {
+ enabled: !automaticDemoMode
+ PropertyAnimation { duration: 2000 }
+ }
+}
diff --git a/imports/shared/service/valuesource/qmldir b/imports/shared/service/valuesource/qmldir
new file mode 100644
index 0000000..844c635
--- /dev/null
+++ b/imports/shared/service/valuesource/qmldir
@@ -0,0 +1 @@
+singleton ValueSource 1.0 ValueSource.qml
diff --git a/imports/shared/utils/AppUIScreen.qml b/imports/shared/utils/AppUIScreen.qml
new file mode 100644
index 0000000..fc80c06
--- /dev/null
+++ b/imports/shared/utils/AppUIScreen.qml
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+import QtQuick 2.1
+
+import QtApplicationManager 1.0
+import controls 1.0
+import utils 1.0
+
+ApplicationManagerWindow {
+ id: pelagicoreWindow
+ width: Style.cellWidth * 24
+ height: Style.cellHeight * 24
+
+ default property alias content: content.children
+ property var clusterComponent
+ property alias cluster: clusterContainer.children
+ property alias passenger: passengerContainer.children
+
+ signal clusterKeyPressed(int key)
+ signal raiseApp()
+
+ onWindowPropertyChanged: {
+ //print(":::AppUIScreen::: Window property changed", name, value)
+ if (name === "visibility" && value === true) {
+ pelagicoreWindow.raiseApp()
+ }
+ }
+
+ function back() {
+ pelagicoreWindow.setWindowProperty("visibility", false)
+ }
+
+ DisplayBackground {
+ anchors.fill: parent
+ }
+
+ ApplicationManagerWindow {
+ id: clusterSurface
+ width: typeof parent !== 'undefined' ? parent.width : Style.cellWidth * 24
+ height: typeof parent !== 'undefined' ? parent.height : Style.cellHeight * 24
+ color: "transparent"
+ visible: clusterContainer.children.length > 0 && Style.withCluster
+ Item {
+ id: clusterContainer
+ anchors.fill: parent
+ }
+
+ Component.onCompleted: {
+ clusterSurface.setWindowProperty("windowType", "clusterWidget")
+ }
+
+ onWindowPropertyChanged: {
+ //print(":::AppUIScreen::: window property changed", name, value, Qt.Key_Up)
+ pelagicoreWindow.clusterKeyPressed(value)
+ if (name === "visibility") {
+ clusterSurface.visible = value
+ }
+ }
+ }
+
+ ApplicationManagerWindow {
+ id: passengerSurface
+ width: typeof parent !== 'undefined' ? parent.width : Style.cellWidth * 24
+ height: typeof parent !== 'undefined' ? parent.height : Style.cellHeight * 24
+ visible: passengerContainer.children.length > 0
+ color: "transparent"
+
+ Item {
+ id: passengerContainer
+ anchors.fill: parent
+ }
+ Component.onCompleted: {
+ passengerSurface.setWindowProperty("windowType", "passengerWidget")
+ }
+ }
+
+ Item {
+ id: content
+ anchors.fill: parent
+ }
+}
diff --git a/imports/shared/utils/AutoConfig.qml b/imports/shared/utils/AutoConfig.qml
new file mode 100644
index 0000000..fb4c07d
--- /dev/null
+++ b/imports/shared/utils/AutoConfig.qml
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Window 2.2
+import com.pelagicore.ScreenManager 1.0
+
+QtObject {
+ property bool withCluster: false
+ property int cellWidth: 53 // 1280/24
+ property int cellHeight: 33 // 800/24
+ property var fontWeight: Font.Light
+ property int fontSizeXXS: 12
+ property int fontSizeXS: 18
+ property int fontSizeS: 24
+ property int fontSizeM: 28
+ property int fontSizeL: 38
+ property int fontSizeXL: 60
+ property int fontSizeXXL: 80
+
+ property int defaultSymbolSize: symbolSizeS
+ property int defaultGfxSize: 1
+ property int symbolSizeXS: 32
+ property int symbolSizeS: 48
+ property int symbolSizeM: 72
+ property int symbolSizeL: 96
+ property int symbolSizeXL: 114
+ property int symbolSizeXXL: 192
+
+ property string displayBackground: "background_1920x1080"
+
+
+ property int screenWidth: Screen.width
+ property int screenHeight: Math.min(screenWidth * 0.62, Screen.height)
+ property int clusterWidth: 1920
+ property int clusterHeight: 720
+
+ onScreenWidthChanged: cellWidth = Math.floor(screenWidth/24)
+ onScreenHeightChanged: cellHeight = Math.floor(screenHeight/24)
+
+ Component.onCompleted: {
+ var scalFactor = (screenWidth/1280);
+
+ print("resolution: " + screenWidth + "x" + screenHeight)
+ print("scalFactor: ", scalFactor)
+
+ cellWidth = Math.floor(screenWidth/24)
+ cellHeight = Math.floor(screenHeight/24)
+
+ var symbolSize = symbolSizeS
+ var gfxSize = 1
+ if (scalFactor >= 6) {
+ symbolSize = symbolSizeXL
+ gfxSize = 4
+ } else if (scalFactor >= 2) {
+ symbolSize = symbolSizeL
+ gfxSize = 3
+ } else if (scalFactor >= 1.5) {
+ symbolSize = symbolSizeM
+ gfxSize = 2
+ }
+
+ defaultSymbolSize = symbolSize
+ defaultGfxSize = 4
+
+
+ fontSizeXXS = scalFactor * 14
+
+ fontSizeXS = scalFactor * 16
+
+ fontSizeS = scalFactor * 18
+
+ fontSizeM = scalFactor * 24
+
+ fontSizeL = scalFactor * 28
+
+ fontSizeXL = scalFactor * 36
+
+ fontSizeXXL = scalFactor * 48
+
+ fontWeight = Font.Light
+
+ if (showClusterIfPossible) {
+ print("Instrument Cluster enabled")
+ withCluster = true
+ clusterWidth = ScreenManager.availableScreens[1].size.width
+ clusterHeight = Math.min(ScreenManager.availableScreens[1].size.width * 0.375, ScreenManager.availableScreens[1].size.height)
+ print("cluster resolution: " + clusterWidth + "x" + clusterHeight)
+ }
+ }
+}
diff --git a/imports/shared/utils/Spacer.qml b/imports/shared/utils/Spacer.qml
new file mode 100644
index 0000000..0322c18
--- /dev/null
+++ b/imports/shared/utils/Spacer.qml
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+import utils 1.0
+
+UIElement {
+ id: root
+ hspan: 1
+ vspan: 1
+ property bool divider: false
+ property alias size: text.font.pixelSize
+
+ Text {
+ id: text
+ anchors.centerIn: parent
+ font.family: Style.fontFamily
+ color: Style.colorWhite
+ font.pixelSize: Style.fontSizeM
+ text: '|'
+ visible: root.divider
+ }
+}
diff --git a/imports/shared/utils/Style.qml b/imports/shared/utils/Style.qml
new file mode 100644
index 0000000..8a6549a
--- /dev/null
+++ b/imports/shared/utils/Style.qml
@@ -0,0 +1,227 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+pragma Singleton
+import QtQuick 2.1
+import QtApplicationManager 1.0
+import QtQuick.Window 2.2
+
+QtObject {
+ id: root
+
+ property bool withCluster
+ property bool withPassengerView
+ property int paddingXS
+ property int paddingS
+ property int padding
+ property int paddingL
+ property int paddingXL
+ property int paddingXXL
+
+ property int screenWidth: 1080//Screen.width
+ property int screenHeight: 1920//Screen.height
+ property int bottomBarWidth: screenWidth
+ property int bottomBarHeight: 270
+ property int launchBarHeight: 512
+ property int statusBarHeight: 100
+ property int searchInputHeight: 50
+
+ property int cellWidth
+ property int cellHeight
+ property int tumblerWidth
+ property int buttonRadius
+
+ property string fontFamily
+ property real fontWeight
+ property int fontSizeXXS
+ property int fontSizeXS
+ property int fontSizeS
+ property int fontSizeM
+ property int fontSizeL
+ property int fontSizeXL
+ property int fontSizeXXL
+
+ property color colorWhite
+ property color colorOrange
+ property color colorGrey
+ property color colorBlack
+ property color colorPink
+
+ property color textcolor: '#ffffff'
+
+ property color darkGrey: '#101A1A'
+ property bool debugMode
+ property bool fakeBackground
+ property string displayBackground
+ property real disabledIconOpacity
+
+ property int defaultSymbolSize
+ property int defaultGfxSize
+ property int symbolSizeXS
+ property int symbolSizeS
+ property int symbolSizeM
+ property int symbolSizeL
+
+ property bool clusterWidgetReady: false
+
+ property url drawableUrl: Qt.resolvedUrl('../assets/drawable-ldpi')
+ property url symbolUrl: Qt.resolvedUrl('../assets/icons')
+ property url gfxUrl: Qt.resolvedUrl('../assets/gfx/')
+ property url fonts: Qt.resolvedUrl('../assets/fonts/')
+
+ property bool isClient: typeof ApplicationInterface !== 'undefined'
+ property string styleConfig: isClient ? ApplicationInterface.additionalConfiguration.styleConfig : ApplicationManager.additionalConfiguration.styleConfig
+ property bool showClusterIfPossible: isClient ? ApplicationInterface.additionalConfiguration.showCluster :ApplicationManager.additionalConfiguration.showCluster
+
+ property Loader styleLoader: Loader {
+ property bool showClusterIfPossible: root.showClusterIfPossible
+ source: styleConfig === "auto" ? Qt.resolvedUrl("AutoConfig.qml") : styleConfig
+
+ onLoaded: {
+ print("StyleConfig loaded: ", source)
+ withCluster = configValue("withCluster", true)
+ withPassengerView = configValue("withPassengerView", false)
+ paddingXS = configValue("paddingXS", 2)
+ paddingS = configValue("paddingS", 4)
+ padding = configValue("padding", 10)
+ paddingL = configValue("paddingL", 12)
+ paddingXL = configValue("paddingXL", 16)
+ paddingXXL = configValue("paddingXL", 20)
+
+ cellWidth = configValue("cellWidth", 53)
+ cellHeight = configValue("cellHeight", 33)
+ tumblerWidth = configValue("tumblerWidth", 150)
+ buttonRadius = configValue("buttomRadius", 5)
+
+ fontFamily = configValue("fontFamily", true ? 'Lato' : fontRegular.name)
+ fontWeight = configValue("fontWeight", Font.Light)
+ fontSizeXXS = configValue("fontSizeXXS", 12)
+ fontSizeXS = configValue("fontSizeXS", 18)
+ fontSizeS = configValue("fontSizeS", 24)
+ fontSizeM = configValue("fontSizeM", 28)
+ fontSizeL = configValue("fontSizeL", 38)
+ fontSizeXL = configValue("fontSizeXL", 60)
+ fontSizeXXL = configValue("fontSizeXXL", 80)
+
+ colorWhite = configValue("colorWhite", '#ffffff')
+ colorOrange = configValue("colorOrange", '#f07d00')
+ colorGrey = configValue("colorGrey", '#999999')
+ colorBlack = configValue("colorBlack", '#000000')
+ colorPink = configValue("colorPink", '#EF0080')
+
+ debugMode = configValue("debugMode", false)
+ fakeBackground = configValue("fakeBackground", false)
+ displayBackground = configValue("displayBackground", "background_1280x800")
+ disabledIconOpacity = configValue("disabledIconOpacity", 0.6)
+
+ defaultSymbolSize = configValue("defaultSymbolSize", symbolSizeS)
+ defaultGfxSize = configValue("defaultGfxSize", 1)
+ symbolSizeXS = configValue("symbolSizeXS", 32)
+ symbolSizeS = configValue("symbolSizeS", 48)
+ symbolSizeL = configValue("symbolSizeL", 96)
+ symbolSizeM = configValue("symbolSizeM", 72)
+ }
+ }
+
+ property FontLoader fontRegular: FontLoader {
+ source: font('Lato-Regular')
+ }
+
+ property FontLoader fontLight: FontLoader {
+ source: font('Lato-Light')
+ }
+
+ function configValue(key, defaultValue) {
+ //console.log("configValue: " + key + " = ")
+ //console.log(styleLoader.item[key] ? styleLoader.item[key] : defaultValue)
+ return styleLoader.item[key] ? styleLoader.item[key] : defaultValue
+ }
+
+ function symbol(name, active) {
+ return symbolUrl + '/' + name + '.png'
+ }
+
+ function symbolXS(name, active) {
+ return symbol(name, symbolSizeXS, active);
+ }
+
+ function symbolS(name, active) {
+ return symbol(name, symbolSizeS, active);
+ }
+
+ function symbolM(name, active) {
+ return symbol(name, symbolSizeM, active);
+ }
+
+ function symbolL(name, active) {
+ return symbol(name, symbolSizeL, active);
+ }
+
+ function symbolXL(name, active) {
+ return symbol(name, symbolSizeXL, active);
+ }
+
+ function symbolXXL(name, active) {
+ return symbol(name, symbolSizeXXL, active);
+ }
+
+
+ function gfx2(name) {
+ return gfxUrl + name + '.png'
+ }
+
+ function gfx2Dynamic(name, size) {
+ return gfxUrl + name + '@' + size + 'x.png'
+ }
+
+ function icon(name) {
+ return drawableUrl + '/' + name + '.png';
+ }
+
+ function gfx(name) {
+ return drawableUrl + '/' + name + '.png';
+ }
+
+ function hspan(value) {
+ return cellWidth * value
+ }
+
+ function vspan(value) {
+ return cellHeight * value
+ }
+
+ function asset(name) {
+ return Qt.resolvedUrl('../assets/' + name)
+ }
+
+ function font(name) {
+ return Qt.resolvedUrl('../assets/fonts/' + name + '.ttf')
+ }
+}
diff --git a/imports/shared/utils/Tracer.qml b/imports/shared/utils/Tracer.qml
new file mode 100644
index 0000000..f24ba95
--- /dev/null
+++ b/imports/shared/utils/Tracer.qml
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+import utils 1.0
+
+Item {
+ id: root
+ anchors.fill: parent
+ property color color: '#ac193d'
+ property alias text: note.text
+ property int padding: 1
+ visible: Style.debugMode
+
+ Rectangle {
+ id: frame
+ anchors.fill: parent
+ anchors.margins: root.padding
+ color: 'transparent'
+ border.color: root.color
+ border.width: 2
+ opacity: 0.5
+ }
+
+ Text {
+ id: note
+ anchors.bottom: parent.bottom
+ anchors.right: parent.right
+ anchors.margins: 4
+ horizontalAlignment: Text.AlignRight
+ font.pixelSize: 12
+ color: root.color
+ }
+}
diff --git a/imports/shared/utils/UIElement.qml b/imports/shared/utils/UIElement.qml
new file mode 100644
index 0000000..843b3bb
--- /dev/null
+++ b/imports/shared/utils/UIElement.qml
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+import utils 1.0
+
+Item {
+ width: Style.cellWidth * hspan
+ height: Style.cellHeight * vspan
+ property int hspan: 4
+ property int vspan: 1
+
+ property alias _tracer_color: tracer.color
+ property alias _tracer_padding: tracer.padding
+
+ Tracer {
+ id: tracer
+ }
+}
diff --git a/imports/shared/utils/UIScreen.qml b/imports/shared/utils/UIScreen.qml
new file mode 100644
index 0000000..88086da
--- /dev/null
+++ b/imports/shared/utils/UIScreen.qml
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Controls 1.0
+import utils 1.0
+import controls 1.0
+
+UIElement {
+ id: root
+ hspan: 24
+ vspan: 24
+
+ property Component statusItem: Item {}
+ property string title
+ property bool showBack: true
+
+ signal backScreen()
+
+ DisplayBackground {
+ anchors.fill: parent
+ visible: root.parent && root.parent.parent === null
+ }
+
+ Tool {
+ id: backButton
+ z: 5
+ anchors.left: parent.left
+ anchors.top: parent.top
+ anchors.margins: Style.padding
+ visible: root.showBack
+ name: 'back'
+ onClicked: root.backScreen()
+ }
+ Label {
+ anchors.verticalCenter: backButton.verticalCenter
+ anchors.horizontalCenter: parent.horizontalCenter
+ text: title
+ font.pixelSize: Style.fontSizeXXL
+ }
+
+}
+
diff --git a/imports/shared/utils/qmldir b/imports/shared/utils/qmldir
new file mode 100644
index 0000000..6202c12
--- /dev/null
+++ b/imports/shared/utils/qmldir
@@ -0,0 +1,12 @@
+singleton Style 1.0 Style.qml
+AutoConfig 1.0 AutoConfig.qml
+Marker 1.0 Marker.qml
+Spacer 1.0 Spacer.qml
+Tracer 1.0 Tracer.qml
+UIElement 1.0 UIElement.qml
+UIPanel 1.0 UIPanel.qml
+UIScreen 1.0 UIScreen.qml
+UIPage 1.0 UIPage.qml
+AppUIScreen 1.0 AppUIScreen.qml
+NavigationUIScreen 1.0 NavigationUIScreen.qml
+Layouter 1.0 Layouter.qml
diff --git a/imports/system/models/ApplicationManagerInterface.qml b/imports/system/models/ApplicationManagerInterface.qml
new file mode 100644
index 0000000..03ff573
--- /dev/null
+++ b/imports/system/models/ApplicationManagerInterface.qml
@@ -0,0 +1,173 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+** SPDX-License-Identifier: GPL-3.0
+**
+****************************************************************************/
+
+pragma Singleton
+import QtQuick 2.0
+import QtApplicationManager 1.0
+import service.music 1.0
+import utils 1.0
+import com.pelagicore.ScreenManager 1.0
+
+QtObject {
+ id: root
+
+ property string activeAppId
+
+ property variant blackListItems: []
+ property Item windowItem
+ property Item mapWidget
+
+ signal applicationSurfaceReady(Item item)
+ signal releaseApplicationSurface()
+
+ // Cluster signals
+ signal clusterWidgetReady(string category, Item item)
+ signal clusterWidgetActivated(string category, Item item)
+
+ signal passengerWidgetReady(string category, Item item)
+
+ Component.onCompleted: {
+ WindowManager.windowReady.connect(windowReadyHandler)
+ WindowManager.windowClosing.connect(windowClosingHandler)
+ ApplicationManager.applicationWasActivated.connect(applicationActivated)
+ WindowManager.windowLost.connect(windowLostHandler)
+ WindowManager.windowPropertyChanged.connect(windowPropertyChanged)
+ }
+
+ function windowReadyHandler(index, item) {
+ print(":::LaunchController::: WindowManager:windowReadyHandler", index, item)
+ var isInWidgetState = (WindowManager.windowProperty(item, "windowType") === "widgetMap")
+ print(":::LaunchController:::isWidget", isInWidgetState)
+ var isClusterWidget = (WindowManager.windowProperty(item, "windowType") === "clusterWidget")
+ print(":::LaunchController:::isClusterWidget", isClusterWidget)
+ var isPassengerWidget = (WindowManager.windowProperty(item, "windowType") === "passengerWidget")
+ print(":::LaunchController:::isPassengerWidget", isPassengerWidget)
+
+ var acceptWindow = true;
+ var appID = WindowManager.get(index).applicationId;
+
+ if (isInWidgetState) {
+ acceptWindow = false
+ }
+ else if (isClusterWidget) {
+ if (ApplicationManager.additionalConfiguration.showCluster && (WindowManager.runningOnDesktop || ScreenManager.screenCount() > 1)) {
+ if (ApplicationManager.get(appID).categories[0] === "media") {
+ root.clusterWidgetReady("media", item)
+ } else if (ApplicationManager.get(appID).categories[0] === "app") {
+ root.clusterWidgetReady(ApplicationManager.get(appID).categories[1], item)
+ }
+ acceptWindow = false
+ } else {
+ acceptWindow = false
+ item.parent = null
+ }
+ }
+ else if (isPassengerWidget) {
+ if (!Style.withPassengerView) {
+ acceptWindow = false
+ item.parent = null
+ } else {
+ if (ApplicationManager.get(appID).categories[0] === "app") {
+ root.passengerWidgetReady(ApplicationManager.get(appID).categories[1], item)
+ }
+ acceptWindow = false
+ }
+ }
+ else {
+
+ for (var i = 0; i < root.blackListItems.length; ++i) {
+ if (appID === root.blackListItems[i])
+ acceptWindow = false;
+ }
+
+ }
+
+ if (acceptWindow) {
+ root.windowItem = item
+ WindowManager.setWindowProperty(item, "visibility", true)
+
+ root.applicationSurfaceReady(item)
+ } else {
+ if (!item.parent) {
+ item.parent = root.windowItem
+ item.visible = false
+ item.paintingEnabled = false
+ }
+ }
+ }
+
+ function windowPropertyChanged(window, name, value) {
+ print(":::LaunchController::: WindowManager:windowPropertyChanged", window, name, value)
+ if (name === "visibility" && value === false) {
+ root.releaseApplicationSurface()
+ }
+ }
+
+ function windowClosingHandler(index, item) {
+ if (item === root.windowItem) { // start close animation
+ root.releaseApplicationSurface()
+ }
+ }
+
+ function windowLostHandler(index, item) {
+ WindowManager.releaseWindow(item) // immediately close anything which is not handled by this container
+ }
+
+ function applicationActivated(appId, appAliasId) {
+ print(":::LaunchController::: WindowManager:raiseApplicationWindow" + appId + " " + WindowManager.count)
+ root.activeAppId = appId
+ for (var i = 0; i < WindowManager.count; i++) {
+ if (WindowManager.get(i).applicationId === appId) {
+ var item = WindowManager.get(i).windowItem
+ print(":::LaunchController::: App found. Running the app " + appId + " Item: " + item)
+ var isWidget = (WindowManager.windowProperty(item, "windowType") === "widget")
+ var isMapWidget = (WindowManager.windowProperty(item, "windowType") === "widgetMap")
+ var isClusterWidget = (WindowManager.windowProperty(item, "windowType") === "clusterWidget")
+ var isPassengerWidget = (WindowManager.windowProperty(item, "windowType") === "passengerWidget")
+ print(":::LaunchController:::isClusterWidget", isClusterWidget)
+ print(":::LaunchController:::isPassengerWidget", isPassengerWidget)
+ print(":::LaunchController:::isWidget", isWidget, isMapWidget)
+
+ if (isClusterWidget) {
+ if (ApplicationManager.get(appId).categories[0] === "app") {
+ root.clusterWidgetActivated(ApplicationManager.get(appId).categories[1], item)
+ }
+ break
+ }
+
+ if (!isMapWidget && !isClusterWidget && !isPassengerWidget) {
+ WindowManager.setWindowProperty(item, "visibility", true)
+ root.windowItem = item
+ root.applicationSurfaceReady(item)
+ }
+ }
+ }
+ }
+}
diff --git a/imports/system/models/qmldir b/imports/system/models/qmldir
new file mode 100644
index 0000000..e947d97
--- /dev/null
+++ b/imports/system/models/qmldir
@@ -0,0 +1 @@
+singleton ApplicationManagerInterface 1.0 ApplicationManagerInterface.qml