aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBramastyo Harimukti Santoso <bram.santoso@qt.io>2021-01-19 16:23:52 +0100
committerBramastyo Harimukti Santoso <bram.santoso@qt.io>2021-01-19 16:47:09 +0100
commitdf878f3935fe28dd3d7253b9fa59d65db331eed0 (patch)
treedf27168c9196d4ff4458f86a9fefdd6ecee84d47
parent88c1d70ca626be6420160c6218e07867541ae8e3 (diff)
parente5dcdea6750b7689feae69083f39f283cc79b9b1 (diff)
Merge remote-tracking branch 'origin/5.15' into dev
-rw-r--r--.gitattributes1
-rw-r--r--.lfsconfig2
-rw-r--r--.qmake.conf2
-rw-r--r--Main.qml11
-rw-r--r--README.md26
-rw-r--r--am-config-android.yaml4
-rw-r--r--am-config-lucee.yaml34
-rw-r--r--am-config-neptune.yaml29
-rw-r--r--apps/com.luxoft.vehicle/3d/entities/Body.qml14
-rw-r--r--apps/com.luxoft.vehicle/3d/entities/CameraController.qml127
-rw-r--r--apps/com.luxoft.vehicle/3d/entities/Roof.qml9
-rw-r--r--apps/com.luxoft.vehicle/3d/entities/qmldir1
-rw-r--r--apps/com.luxoft.vehicle/Main.qml20
-rw-r--r--apps/com.luxoft.vehicle/MainIC.qml47
-rw-r--r--apps/com.luxoft.vehicle/assets/3dCar/materials/Brushed_Chrome_0002.materialdef4
-rw-r--r--apps/com.luxoft.vehicle/assets/3dCar/materials/Coloured_Glass11.materialdef4
-rw-r--r--apps/com.luxoft.vehicle/assets/3dCar/materials/Int_panel_plastic_matte_111.materialdef4
-rw-r--r--apps/com.luxoft.vehicle/assets/3dCar/materials/Rubber_-_Black_001.materialdef4
-rw-r--r--apps/com.luxoft.vehicle/assets/3dCar/materials/Simple_Glass_111.materialdef4
-rw-r--r--apps/com.luxoft.vehicle/assets/3dCar/materials/leicht_metalic_110.materialdef4
-rw-r--r--apps/com.luxoft.vehicle/assets/3dCar/materials/rear_tires11.materialdef4
-rw-r--r--apps/com.luxoft.vehicle/assets/3dCar/materials/seats_111.materialdef4
-rw-r--r--apps/com.luxoft.vehicle/assets/3dCar/materials/shell.inside_Diffuse_Default.materialdef3
-rw-r--r--apps/com.luxoft.vehicle/assets/3dCar/models/car/meshes/shell.mesh4
-rw-r--r--apps/com.luxoft.vehicle/assets/3dCar/models/shell inside/meshes/shell.inside.mesh3
-rw-r--r--apps/com.luxoft.vehicle/assets/3dCar/models/shell inside/shell inside.import18
-rw-r--r--apps/com.luxoft.vehicle/assets/3dCar/presentations/vehicle3dStudio.uip344
-rw-r--r--apps/com.luxoft.vehicle/assets/3dCar/vehicle3dStudio.uia16
-rw-r--r--apps/com.luxoft.vehicle/helpers/Qt3DStudioAvailable.qml3
-rw-r--r--apps/com.luxoft.vehicle/helpers/pathsProvider.js11
-rw-r--r--apps/com.luxoft.vehicle/info.yaml25
-rw-r--r--apps/com.luxoft.vehicle/panels/DoorsPanel.qml9
-rw-r--r--apps/com.luxoft.vehicle/panels/EnergyPanel.qml14
-rw-r--r--apps/com.luxoft.vehicle/panels/FrontDoorsPanel.qml3
-rw-r--r--apps/com.luxoft.vehicle/panels/RoofPanel.qml43
-rw-r--r--apps/com.luxoft.vehicle/panels/TrunkPanel.qml57
-rw-r--r--apps/com.luxoft.vehicle/panels/Vehicle3DControlPanel.qml13
-rw-r--r--apps/com.luxoft.vehicle/panels/Vehicle3DPanel.qml118
-rw-r--r--apps/com.luxoft.vehicle/panels/Vehicle3DStudioPanel.qml18
-rw-r--r--apps/com.luxoft.vehicle/panels/VehicleProxyPanel.qml11
-rw-r--r--apps/com.luxoft.vehicle/stores/VehicleStore.qml106
-rw-r--r--apps/com.luxoft.vehicle/stores/VehicleStoreIC.qml63
-rw-r--r--apps/com.luxoft.vehicle/stores/qmldir1
-rw-r--r--apps/com.luxoft.vehicle/views/VehicleICView.qml4
-rw-r--r--apps/com.luxoft.vehicle/views/VehicleView.qml86
-rw-r--r--apps/com.pelagicore.apps.settings/Main.qml2
-rw-r--r--apps/com.pelagicore.apps.settings/controls/ColorSelector.qml49
-rw-r--r--apps/com.pelagicore.apps.settings/info.yaml14
-rw-r--r--apps/com.pelagicore.apps.settings/panels/ConnectivityPanel.qml6
-rw-r--r--apps/com.pelagicore.apps.settings/panels/HotspotPanel.qml8
-rw-r--r--apps/com.pelagicore.apps.settings/panels/LanguagePanel.qml7
-rw-r--r--apps/com.pelagicore.apps.settings/panels/WiFiPanel.qml8
-rw-r--r--apps/com.pelagicore.apps.settings/popups/WiFiPopup.qml196
-rw-r--r--apps/com.pelagicore.apps.settings/store/RootStore.qml81
-rw-r--r--apps/com.pelagicore.apps.settings/views/SettingsView.qml28
-rw-r--r--apps/com.pelagicore.calendar/Main.qml2
-rw-r--r--apps/com.pelagicore.calendar/info.yaml13
-rw-r--r--apps/com.pelagicore.calendar/panels/+lucee/CalendarWidgetPanel.qml6
-rw-r--r--apps/com.pelagicore.calendar/panels/CalendarMaximizedPanel.qml18
-rw-r--r--apps/com.pelagicore.calendar/stores/CalendarStore.qml9
-rw-r--r--apps/com.pelagicore.climate/controls/+lucee/TemperatureLabel.qml8
-rw-r--r--apps/com.pelagicore.climate/controls/TemperatureLabel.qml4
-rw-r--r--apps/com.pelagicore.climate/controls/TemperatureSlider.qml17
-rw-r--r--apps/com.pelagicore.climate/info.yaml10
-rw-r--r--apps/com.pelagicore.climate/panels/+lucee/ClimateIndicatorPanel.qml20
-rw-r--r--apps/com.pelagicore.climate/panels/ClimateContentPanel.qml19
-rw-r--r--apps/com.pelagicore.climate/panels/ClimateIndicatorPanel.qml4
-rw-r--r--apps/com.pelagicore.climate/popups/ClimatePopup.qml6
-rw-r--r--apps/com.pelagicore.climate/stores/ClimateStore.qml4
-rw-r--r--apps/com.pelagicore.climate/views/ClimateView.qml33
-rw-r--r--apps/com.pelagicore.downloads/Main.qml2
-rw-r--r--apps/com.pelagicore.downloads/controls/DownloadAppList.qml64
-rw-r--r--apps/com.pelagicore.downloads/controls/DownloadsToolsColumn.qml70
-rw-r--r--apps/com.pelagicore.downloads/info.yaml12
-rw-r--r--apps/com.pelagicore.downloads/stores/DownloadsStates.qml317
-rw-r--r--apps/com.pelagicore.downloads/stores/DownloadsStore.qml298
-rw-r--r--apps/com.pelagicore.downloads/stores/JSONBackend.js46
-rw-r--r--apps/com.pelagicore.downloads/stores/JSONModel.qml10
-rw-r--r--apps/com.pelagicore.downloads/stores/ServerConfig.qml80
-rw-r--r--apps/com.pelagicore.downloads/views/DownloadsView.qml343
-rw-r--r--apps/com.pelagicore.hud/Main.qml87
-rw-r--r--apps/com.pelagicore.hud/assets/nav_bear_l-dark.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_bear_l.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_bear_r-dark.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_bear_r.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_hard_l-dark.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_hard_l.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_hard_r-dark.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_hard_r.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_left-dark.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_left.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_light_left-dark.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_light_left.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_light_right-dark.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_light_right.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_right-dark.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_right.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_straight-dark.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_straight.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_uturn_l-dark.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_uturn_l.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_uturn_r-dark.png3
-rw-r--r--apps/com.pelagicore.hud/assets/nav_uturn_r.png3
-rw-r--r--apps/com.pelagicore.hud/helpers/helper.js36
-rw-r--r--apps/com.pelagicore.hud/helpers/qmldir2
-rw-r--r--apps/com.pelagicore.hud/info.yaml10
-rw-r--r--apps/com.pelagicore.hud/panels/NaviPanel.qml83
-rw-r--r--apps/com.pelagicore.hud/panels/SpeedPanel.qml112
-rw-r--r--apps/com.pelagicore.hud/stores/AbstractStore.qml44
-rw-r--r--apps/com.pelagicore.hud/stores/RootStore.qml51
-rw-r--r--apps/com.pelagicore.hud/views/MainView.qml64
-rw-r--r--apps/com.pelagicore.map/Main.qml32
-rw-r--r--apps/com.pelagicore.map/assets/nav_bear_l-dark.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_bear_l.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_bear_r-dark.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_bear_r.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_hard_l-dark.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_hard_l.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_hard_r-dark.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_hard_r.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_left-dark.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_left.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_light_left-dark.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_light_left.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_light_right-dark.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_light_right.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_right-dark.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_right.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_straight-dark.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_straight.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_uturn_l-dark.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_uturn_l.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_uturn_r-dark.png3
-rw-r--r--apps/com.pelagicore.map/assets/nav_uturn_r.png3
-rw-r--r--apps/com.pelagicore.map/assets/proxy-CC-dark.png3
-rw-r--r--apps/com.pelagicore.map/assets/proxy-CC.png3
-rw-r--r--apps/com.pelagicore.map/assets/proxy-cluster-dark.png3
-rw-r--r--apps/com.pelagicore.map/assets/proxy-cluster.png3
-rw-r--r--apps/com.pelagicore.map/helpers/StandAlone.qml7
-rw-r--r--apps/com.pelagicore.map/info.yaml16
-rw-r--r--apps/com.pelagicore.map/panels/FavDestinationButtonsPanel.qml4
-rw-r--r--apps/com.pelagicore.map/panels/ProxyErrorPanel.qml89
-rw-r--r--apps/com.pelagicore.map/panels/qmldir1
-rw-r--r--apps/com.pelagicore.map/stores/MapStore.qml87
-rw-r--r--apps/com.pelagicore.map/stores/NavigationStore.qml182
-rw-r--r--apps/com.pelagicore.map/views/ICMapView.qml67
-rw-r--r--apps/com.pelagicore.map/views/MapView.qml15
-rw-r--r--apps/com.pelagicore.music/info.yaml11
-rw-r--r--apps/com.pelagicore.music/popups/MusicSourcesPopup.qml3
-rw-r--r--apps/com.pelagicore.music/stores/MusicStore.qml20
-rw-r--r--apps/com.pelagicore.music/views/+lucee/FullScreenBottomView.qml8
-rw-r--r--apps/com.pelagicore.music/views/+lucee/MusicView.qml2
-rw-r--r--apps/com.pelagicore.music/views/+lucee/WidgetContentView.qml4
-rw-r--r--apps/com.pelagicore.music/views/FullScreenBottomView.qml40
-rw-r--r--apps/com.pelagicore.music/views/WidgetContentView.qml2
-rw-r--r--apps/com.pelagicore.phone/Main.qml5
-rw-r--r--apps/com.pelagicore.phone/controls/BlurredImageBackground.qml3
-rw-r--r--apps/com.pelagicore.phone/controls/RoundImage.qml3
-rw-r--r--apps/com.pelagicore.phone/controls/WidgetContact.qml6
-rw-r--r--apps/com.pelagicore.phone/info.yaml12
-rw-r--r--apps/com.pelagicore.phone/stores/PhoneStore.qml19
-rw-r--r--apps/com.pelagicore.phone/views/CallWidgetView.qml1
-rw-r--r--apps/com.pelagicore.phone/views/ContactsView.qml1
-rw-r--r--apps/com.pelagicore.phone/views/FavoritesWidgetView.qml2
-rw-r--r--apps/com.pelagicore.phone/views/RecentCallsView.qml1
-rw-r--r--apps/com.pelagicore.tuner/info.yaml11
-rw-r--r--apps/com.pelagicore.tuner/popups/MusicSourcesPopup.qml3
-rw-r--r--apps/com.pelagicore.tuner/stores/TunerStore.qml4
-rw-r--r--apps/com.pelagicore.tuner/views/FullScreenBottomView.qml29
-rw-r--r--apps/com.theqtcompany.cluster/Main.qml12
-rw-r--r--apps/com.theqtcompany.cluster/assets/+lucee/ic-battery.png3
-rw-r--r--apps/com.theqtcompany.cluster/assets/+lucee/ic-distance.png3
-rw-r--r--apps/com.theqtcompany.cluster/assets/3dGauges/gauges.uia30
-rw-r--r--apps/com.theqtcompany.cluster/assets/3dGauges/maps/gradient_lines_001-w.png4
-rw-r--r--apps/com.theqtcompany.cluster/assets/3dGauges/presentations/gauges.uip660
-rw-r--r--apps/com.theqtcompany.cluster/helpers/Qt3DStudioAvailable.qml3
-rw-r--r--apps/com.theqtcompany.cluster/info.yaml16
-rw-r--r--apps/com.theqtcompany.cluster/panels/+lucee/DialSpeedPanel.qml26
-rw-r--r--apps/com.theqtcompany.cluster/panels/+lucee/GaugesPanel.qml11
-rw-r--r--apps/com.theqtcompany.cluster/panels/GaugesPanel.qml1
-rw-r--r--apps/com.theqtcompany.cluster/panels/GaugesPanel3D.qml37
-rw-r--r--apps/com.theqtcompany.cluster/panels/SafeTelltalesPanel.qml14
-rw-r--r--apps/com.theqtcompany.cluster/stores/BehaviourInterface.qml8
-rw-r--r--apps/com.theqtcompany.cluster/stores/RootStore.qml7
-rw-r--r--apps/com.theqtcompany.cluster/views/+lucee/ClusterView.qml4
-rw-r--r--apps/com.theqtcompany.cluster/views/ClusterView.qml4
-rw-r--r--copydata.pro6
-rw-r--r--dev/apps/com.pelagicore.sheets/components/ButtonPanel.qml26
-rw-r--r--dev/apps/com.pelagicore.sheets/components/ListItemPanel.qml42
-rw-r--r--dev/apps/com.pelagicore.sheets/components/NotificationPanel.qml62
-rw-r--r--dev/apps/com.pelagicore.sheets/components/PopupsPanel.qml21
-rw-r--r--dev/apps/com.pelagicore.sheets/components/ProgressBarPanel.qml8
-rw-r--r--dev/apps/com.pelagicore.sheets/components/SliderPanel.qml4
-rw-r--r--dev/apps/com.pelagicore.sheets/components/ToolButtonPanel.qml20
-rw-r--r--dev/apps/com.pelagicore.sheets/info.yaml9
-rw-r--r--dev/apps/com.pelagicore.sheets/popups/PopupWithList.qml5
-rw-r--r--doc/src/examples-parking-app-tutorial.qdoc2
-rw-r--r--doc/src/images/alexa-status-bar-button.png3
-rw-r--r--doc/src/images/app-launcher-downloads.png3
-rw-r--r--doc/src/images/app-launcher-downloads2.png3
-rw-r--r--doc/src/images/arrow_bc.png3
-rw-r--r--doc/src/images/bgrContent.png3
-rw-r--r--doc/src/images/btn_next.png3
-rw-r--r--doc/src/images/btn_prev.png3
-rw-r--r--doc/src/images/bullet_dn.png3
-rw-r--r--doc/src/images/bullet_sq.png3
-rw-r--r--doc/src/images/center-stack-add-widget.jpgbin27358 -> 0 bytes
-rw-r--r--doc/src/images/center-stack-add-widget.png3
-rw-r--r--doc/src/images/center-stack-app-launcher.jpgbin30370 -> 0 bytes
-rw-r--r--doc/src/images/center-stack-app-launcher.png3
-rw-r--r--doc/src/images/center-stack-climate.jpgbin26226 -> 0 bytes
-rw-r--r--doc/src/images/center-stack-climate.png3
-rw-r--r--doc/src/images/center-stack-max-app-from-widget.png3
-rw-r--r--doc/src/images/center-stack-maximized-app-home.png3
-rw-r--r--doc/src/images/center-stack-maximized-app.jpgbin46095 -> 0 bytes
-rw-r--r--doc/src/images/center-stack-maximized-app.png3
-rw-r--r--doc/src/images/center-stack-nav.jpgbin30389 -> 0 bytes
-rw-r--r--doc/src/images/center-stack-nav.png3
-rw-r--r--doc/src/images/center-stack-notification-center.jpgbin35001 -> 0 bytes
-rw-r--r--doc/src/images/center-stack-notification-center.png3
-rw-r--r--doc/src/images/center-stack-resize-widget.png3
-rw-r--r--doc/src/images/center-stack.jpgbin42773 -> 0 bytes
-rw-r--r--doc/src/images/center-stack.png3
-rw-r--r--doc/src/images/cluster-app-car.png3
-rw-r--r--doc/src/images/cluster-app-main.png3
-rw-r--r--doc/src/images/cluster-app-map.png3
-rw-r--r--doc/src/images/cluster-app-music.png3
-rw-r--r--doc/src/images/companion-app.png3
-rw-r--r--doc/src/images/desktop_startup.png3
-rw-r--r--doc/src/images/first-integration.png4
-rw-r--r--doc/src/images/home.png3
-rw-r--r--doc/src/images/ico_note.png3
-rw-r--r--doc/src/images/ico_note_attention.png3
-rw-r--r--doc/src/images/ico_out.png3
-rw-r--r--doc/src/images/instrument-cluster-3d-navi.png4
-rw-r--r--doc/src/images/instrument-cluster-3d.png4
-rw-r--r--doc/src/images/instrument-cluster-nav.jpgbin38032 -> 0 bytes
-rw-r--r--doc/src/images/instrument-cluster-nav.png3
-rw-r--r--doc/src/images/instrument-cluster-tt.png3
-rw-r--r--doc/src/images/instrument-cluster-vehicle.png4
-rw-r--r--doc/src/images/instrument-cluster.jpgbin23158 -> 0 bytes
-rw-r--r--doc/src/images/instrument-cluster.png3
-rw-r--r--doc/src/images/logo.png3
-rw-r--r--doc/src/images/music-app-popup.jpgbin33189 -> 0 bytes
-rw-r--r--doc/src/images/music-app-popup.png3
-rw-r--r--doc/src/images/neptune-dark-theme1.jpgbin27121 -> 0 bytes
-rw-r--r--doc/src/images/neptune-dark-theme2.jpgbin21593 -> 0 bytes
-rw-r--r--doc/src/images/neptune-light-theme1.png3
-rw-r--r--doc/src/images/neptune-light-theme2.png3
-rw-r--r--doc/src/images/parking-app.png4
-rw-r--r--doc/src/images/settings-app-accent-color.jpgbin23577 -> 0 bytes
-rw-r--r--doc/src/images/settings-app-accent-color.png3
-rw-r--r--doc/src/images/settings-app-languages.jpgbin25520 -> 0 bytes
-rw-r--r--doc/src/images/settings-app-languages.png3
-rw-r--r--doc/src/images/settings-app-themes.jpgbin21398 -> 0 bytes
-rw-r--r--doc/src/images/settings-app-themes.png3
-rw-r--r--doc/src/images/settings-app-timezone.jpgbin20058 -> 0 bytes
-rw-r--r--doc/src/images/settings-app-timezone.png3
-rw-r--r--doc/src/images/sheets-app-button.png3
-rw-r--r--doc/src/images/sheets-app-listitem.png3
-rw-r--r--doc/src/images/sheets-app-notification.png3
-rw-r--r--doc/src/images/sheets-app-popup.jpgbin24200 -> 0 bytes
-rw-r--r--doc/src/images/sheets-app-popup.png3
-rw-r--r--doc/src/images/sheets-app-popupcolor.png3
-rw-r--r--doc/src/images/sheets-app-popups.png3
-rw-r--r--doc/src/images/sheets-app-progress-bar.png3
-rw-r--r--doc/src/images/sheets-app-slider.png3
-rw-r--r--doc/src/images/sheets-app-toolbutton.png3
-rw-r--r--doc/src/images/sheets-app.png3
-rw-r--r--doc/src/images/system-dialog-apps.jpgbin23584 -> 0 bytes
-rw-r--r--doc/src/images/system-dialog-apps.png3
-rw-r--r--doc/src/images/system-dialog-diagnostics.jpgbin52109 -> 0 bytes
-rw-r--r--doc/src/images/system-dialog-diagnostics.png3
-rw-r--r--doc/src/images/system-dialog-performance.jpgbin20303 -> 0 bytes
-rw-r--r--doc/src/images/system-dialog-performance.png3
-rw-r--r--doc/src/images/system-dialog-system.jpgbin30132 -> 0 bytes
-rw-r--r--doc/src/images/system-dialog-system.png3
-rw-r--r--doc/src/images/system-dialog-system2.jpgbin33710 -> 0 bytes
-rw-r--r--doc/src/images/system-dialog-system2.png3
-rw-r--r--doc/src/images/tools-column.jpgbin8606 -> 0 bytes
-rw-r--r--doc/src/images/tools-column.png3
-rw-r--r--doc/src/images/volume-control-mute.png3
-rw-r--r--doc/src/images/volume-control.png3
-rw-r--r--doc/src/images/widget-bottom.png3
-rw-r--r--doc/src/neptune3ui-3d-integration.qdoc4
-rw-r--r--doc/src/neptune3ui-application-anatomy.qdoc10
-rw-r--r--doc/src/neptune3ui-application-popups.qdoc6
-rw-r--r--doc/src/neptune3ui-application-requests.qdoc113
-rw-r--r--doc/src/neptune3ui-companion-app.qdoc2
-rw-r--r--doc/src/neptune3ui-components.qdoc1
-rw-r--r--doc/src/neptune3ui-configure.qdoc56
-rw-r--r--doc/src/neptune3ui-deployment-server.qdoc49
-rw-r--r--doc/src/neptune3ui-install.qdoc8
-rw-r--r--doc/src/neptune3ui-middleware.qdoc1
-rw-r--r--doc/src/neptune3ui-overview.qdoc238
-rw-r--r--doc/src/neptune3ui-qt-safe-renderer-integration.qdoc26
-rw-r--r--doc/src/neptune3ui-service-settings.qdoc139
-rw-r--r--doc/src/neptune3ui-settings-application.qdoc29
-rw-r--r--doc/src/neptune3ui-system-dialog.qdoc21
-rw-r--r--doc/src/neptune3ui-testing-squish.qdoc4
-rw-r--r--doc/src/neptune3ui-topics.qdocinc3
-rw-r--r--doc/src/neptune3ui-troubleshoot.qdoc4
-rw-r--r--doc/src/neptune3ui-voice-assistant.qdoc61
-rw-r--r--examples/neptune3ui/parking-app-tutorial/chapter1-basics/Main.qml22
-rw-r--r--examples/neptune3ui/parking-app-tutorial/chapter1-basics/chapter1-basics.pro4
-rw-r--r--examples/neptune3ui/parking-app-tutorial/chapter2-extend/Main.qml24
-rw-r--r--examples/neptune3ui/parking-app-tutorial/chapter2-extend/chapter2-extend.pro4
-rw-r--r--examples/neptune3ui/parking-app-tutorial/chapter3-middleware/app/Main.qml24
-rw-r--r--examples/neptune3ui/parking-app-tutorial/chapter3-middleware/app/app.pro4
-rw-r--r--examples/neptune3ui/parking-app-tutorial/chapter3-middleware/backend_simulator/backend_simulator.pro2
-rw-r--r--examples/neptune3ui/parking-app-tutorial/chapter3-middleware/chapter3-middleware.pro2
-rw-r--r--examples/neptune3ui/parking-app-tutorial/chapter3-middleware/frontend/frontend.pro2
-rw-r--r--examples/neptune3ui/parking-app-tutorial/chapter3-middleware/imports/imports.pro2
-rw-r--r--imports_shared/application/windows/NeptuneWindow.qml4
-rw-r--r--imports_shared/assets/fonts/DejaVuSans-Bold.ttf3
-rw-r--r--imports_shared/assets/fonts/DejaVuSans-BoldOblique.ttf3
-rw-r--r--imports_shared/assets/fonts/DejaVuSans-ExtraLight.ttf3
-rw-r--r--imports_shared/assets/fonts/DejaVuSans-Oblique.ttf3
-rw-r--r--imports_shared/assets/fonts/DejaVuSans.ttf3
-rw-r--r--imports_shared/assets/fonts/DejaVuSansCondensed-Bold.ttf3
-rw-r--r--imports_shared/assets/fonts/DejaVuSansCondensed-BoldOblique.ttf3
-rw-r--r--imports_shared/assets/fonts/DejaVuSansCondensed-Oblique.ttf3
-rw-r--r--imports_shared/assets/fonts/DejaVuSansCondensed.ttf3
-rw-r--r--imports_shared/assets/fonts/LICENSE99
-rw-r--r--imports_shared/assets/fonts/LICENSE.txt202
-rw-r--r--imports_shared/assets/fonts/OpenSans-Bold.ttf3
-rw-r--r--imports_shared/assets/fonts/OpenSans-BoldItalic.ttf3
-rw-r--r--imports_shared/assets/fonts/OpenSans-ExtraBold.ttf3
-rw-r--r--imports_shared/assets/fonts/OpenSans-ExtraBoldItalic.ttf3
-rw-r--r--imports_shared/assets/fonts/OpenSans-Italic.ttf3
-rw-r--r--imports_shared/assets/fonts/OpenSans-Light.ttf3
-rw-r--r--imports_shared/assets/fonts/OpenSans-LightItalic.ttf3
-rw-r--r--imports_shared/assets/fonts/OpenSans-Regular.ttf3
-rw-r--r--imports_shared/assets/fonts/OpenSans-SemiBold.ttf3
-rw-r--r--imports_shared/assets/fonts/OpenSans-SemiBoldItalic.ttf3
-rw-r--r--imports_shared/assets/icons/lucee/sysui/ic-addwidget-plus.png4
-rw-r--r--imports_shared/assets/icons/lucee/sysui/ic-close.png4
-rw-r--r--imports_shared/assets/icons/lucee/sysui/ic-connectivity_OFF.png3
-rw-r--r--imports_shared/assets/icons/lucee/sysui/ic-connectivity_ON.png3
-rw-r--r--imports_shared/assets/icons/lucee/sysui/ic-remove.png3
-rw-r--r--imports_shared/assets/icons/neptune/sysui/ic-addwidget-plus.png4
-rw-r--r--imports_shared/assets/icons/neptune/sysui/ic-close.png4
-rw-r--r--imports_shared/assets/icons/neptune/sysui/ic-connectivity_OFF.png4
-rw-r--r--imports_shared/assets/icons/neptune/sysui/ic-menu-allapps.png4
-rw-r--r--imports_shared/assets/icons/neptune/sysui/ic-menu-home.png4
-rw-r--r--imports_shared/assets/icons/neptune/sysui/ic-remove.png3
-rw-r--r--imports_shared/assets/translations/ar_MA.ts349
-rw-r--r--imports_shared/assets/translations/cs_CZ.ts343
-rw-r--r--imports_shared/assets/translations/de_DE.ts698
-rw-r--r--imports_shared/assets/translations/en_GB.ts347
-rw-r--r--imports_shared/assets/translations/en_US.ts347
-rw-r--r--imports_shared/assets/translations/ja_JP.ts353
-rw-r--r--imports_shared/assets/translations/ko_KR.ts353
-rw-r--r--imports_shared/assets/translations/zh_CN.ts353
-rw-r--r--imports_shared/shared/QtQuick/VirtualKeyboard/Styles/neptune/style.qml2
-rw-r--r--imports_shared/shared/utils/Config.qml1
-rw-r--r--imports_shared/shared/utils/Cursor.qml30
-rw-r--r--imports_shared/shared/utils/CursorManagement.qml6
-rw-r--r--imports_shared/shared/utils/CursorManagementDummy.qml1
-rw-r--r--imports_shared/shared/utils/TouchPointsTracer.qml156
-rw-r--r--imports_shared/shared/utils/qmldir1
-rw-r--r--imports_system/system/controls/+lucee/PopupItem.qml15
-rw-r--r--imports_system/system/controls/AbstractPopupItem.qml4
-rw-r--r--imports_system/system/controls/PopupItem.qml5
-rw-r--r--imports_system/system/controls/PopupItemLoader.qml33
-rw-r--r--imports_system/system/models/application/ApplicationInfo.qml32
-rw-r--r--imports_system/system/models/application/ApplicationModel.qml109
-rw-r--r--imports_system/system/models/notification/NotificationModel.qml10
-rw-r--r--imports_system/system/requests/ApplicationRequestHandler.qml2
-rw-r--r--neptune3-ui.pro63
-rw-r--r--plugins.yaml.in11
-rw-r--r--plugins/com.pelagicore.map/mapshelper.cpp6
-rw-r--r--plugins/com.pelagicore.map/mapshelper.h2
-rw-r--r--plugins/controls/ListItem.qml3
-rw-r--r--plugins/controls/ListItemBasic.qml35
-rw-r--r--plugins/controls/ListItemSwitch.qml2
-rw-r--r--plugins/controls/ToolsColumn.qml67
-rw-r--r--plugins/controls/neptuneiconlabel.cpp300
-rw-r--r--plugins/controls/neptuneiconlabel.h23
-rw-r--r--plugins/controls/neptuneiconlabel_p.h10
-rw-r--r--plugins/eventslisteners/eventsListenersPlugin.cpp51
-rw-r--r--plugins/eventslisteners/eventslisteners.pro13
-rw-r--r--plugins/eventslisteners/qmldir3
-rw-r--r--plugins/eventslisteners/touchPointsTracer.h115
-rw-r--r--plugins/fileutils/fileUtils.cpp45
-rw-r--r--plugins/fileutils/fileUtils.h43
-rw-r--r--plugins/fileutils/fileUtilsPlugin.cpp55
-rw-r--r--plugins/fileutils/fileutils.pro14
-rw-r--r--plugins/fileutils/qmldir2
-rw-r--r--plugins/plugins.pro4
-rw-r--r--plugins/style/Style.cpp4
-rw-r--r--plugins/style/StyleData.h4
-rw-r--r--plugins/style/StyleDefaults.cpp5
-rw-r--r--plugins/systeminfo/systeminfo.cpp61
-rw-r--r--plugins/systeminfo/systeminfo.h9
-rw-r--r--plugins/systeminfo/systeminfo.pro2
-rw-r--r--settings_app_android.pro32
-rw-r--r--src/assets/styles/neptune/icons/delete-24px.svg3
-rw-r--r--src/assets/styles/neptune/images/colorSelector/base_for_color_selector.svg3
-rw-r--r--src/connectivity/connectivity/connectivity.pro1
-rw-r--r--src/drivedata/backend/backend.pro2
-rw-r--r--src/drivedata/drivedata-simulation-server/simulation.qml74
-rw-r--r--src/drivedata/drivedata.qface14
-rw-r--r--src/drivedata/drivedata.yaml8
-rw-r--r--src/neptune-cluster-app/ClusterRootStore.qml163
-rw-r--r--src/neptune-cluster-app/Launcher.qml93
-rw-r--r--src/neptune-cluster-app/MockedWindows.qml78
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/+lucee/icon.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/Main.qml45
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_background.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_bodyVehicle.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_leftDoorAlarmVehicle.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_leftDoorClosedVehicle.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_leftDoorOpenedVehicle.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_leftDoorOpenedVehicleCarPart.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_rightDoorAlarmVehicle.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_rightDoorClosedVehicle.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_rightDoorOpenedVehicle.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_rightDoorOpenedVehicleCarPart.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_roofAlarmVehicle.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_roofClosedVehicle.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_roofOpenedVehicle.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_trunkAlarmVehicle.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_trunkClosedVehicle.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_trunkOpenedVehicle.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/helpers/pathsProvider.js36
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/helpers/qmldir2
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/icon.png3
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/panels/Vehicle2DPanel.qml266
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/panels/qmldir1
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/stores/VehicleStore.qml63
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/stores/qmldir1
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/views/VehicleICView.qml57
-rw-r--r--src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/views/qmldir1
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/+lucee/icon.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/Main.qml93
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_bear_l-dark.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_bear_l.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_bear_r-dark.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_bear_r.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_hard_l-dark.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_hard_l.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_hard_r-dark.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_hard_r.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_left-dark.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_left.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_light_left-dark.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_light_left.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_light_right-dark.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_light_right.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_right-dark.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_right.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_straight-dark.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_straight.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_uturn_l-dark.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_uturn_l.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_uturn_r-dark.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_uturn_r.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/pin-destination.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/pin-your-position.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/helpers/helper.js (renamed from sysui/launcher/+lucee/HomeButton.qml)11
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/helpers/qmldir2
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/icon.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/maps/mapboxgl.db3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/stores/MapStore.qml140
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/stores/qmldir1
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/views/ICMapView.qml188
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.map-ic/views/qmldir1
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.music-ic/Main.qml (renamed from sysui/launcher/HomeButton.qml)25
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.music-ic/controls/+lucee/TitleColumn.qml88
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.music-ic/controls/MusicProgress.qml87
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.music-ic/controls/TitleColumn.qml69
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.music-ic/controls/qmldir2
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.music-ic/icon.png3
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.music-ic/panels/ICAlbumArtPanel.qml70
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.music-ic/panels/qmldir1
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.music-ic/stores/MusicStore.qml53
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.music-ic/stores/qmldir1
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.music-ic/views/ICMusicView.qml67
-rw-r--r--src/neptune-cluster-app/apps/com.pelagicore.music-ic/views/qmldir1
-rw-r--r--src/neptune-cluster-app/main.cpp108
-rw-r--r--src/neptune-cluster-app/main.qml100
-rw-r--r--src/neptune-cluster-app/neptune-cluster-app.pro48
-rw-r--r--src/neptune3-ui-qsr-cluster/main.cpp34
-rw-r--r--src/neptune3-ui-qsr-cluster/neptune3-ui-qsr-cluster.pro15
-rw-r--r--src/neptune3-ui-qsr-cluster/neptune3-ui-qsr-cluster_wrapper.bat37
-rw-r--r--src/neptune3-ui-qsr-cluster/safewindow.cpp108
-rw-r--r--src/neptune3-ui-qsr-cluster/safewindow.h30
-rw-r--r--src/neptune3-ui-qsr-cluster/safewindow_mac.h38
-rw-r--r--src/neptune3-ui-qsr-cluster/safewindow_mac.mm39
-rw-r--r--src/neptune3-ui-qsr-cluster/tcpmsghandler.cpp25
-rw-r--r--src/neptune3-ui-qsr-cluster/tcpmsghandler.h2
-rw-r--r--src/neptune3-ui/main.cpp14
-rw-r--r--src/neptune3-ui/neptune3-ui.pro7
-rw-r--r--src/remotesettings/app/DevelopmentPage.qml102
-rw-r--r--src/remotesettings/app/app.pro23
-rw-r--r--src/remotesettings/app/main.cpp19
-rw-r--r--src/remotesettings/app/main.qml4
-rw-r--r--src/remotesettings/backend/backend.pro2
-rw-r--r--src/src.pro5
-rw-r--r--styles/lucee/Button.qml4
-rw-r--r--styles/lucee/ComboBox.qml6
-rw-r--r--styles/lucee/ItemDelegate.qml3
-rw-r--r--styles/lucee/RadioButton.qml3
-rw-r--r--styles/lucee/Switch.qml3
-rw-r--r--styles/lucee/SwitchDelegate.qml6
-rw-r--r--styles/lucee/TabButton.qml4
-rw-r--r--styles/lucee/ToolButton.qml25
-rw-r--r--styles/lucee/images/colorSelector/#51a7f4.png3
-rw-r--r--styles/lucee/images/colorSelector/#535258.png3
-rw-r--r--styles/lucee/images/colorSelector/#78887b.png3
-rw-r--r--styles/lucee/images/colorSelector/#7ba2a5.png3
-rw-r--r--styles/lucee/images/colorSelector/#9eae83.png3
-rw-r--r--styles/lucee/images/colorSelector/#d35756.png3
-rw-r--r--styles/lucee/images/colorSelector/#db3b9f.png3
-rw-r--r--styles/lucee/images/colorSelector/#fba054.png3
-rw-r--r--styles/lucee/images/colorSelector/color-wheel.png3
-rw-r--r--styles/lucee/images/logo-kdab.png4
-rw-r--r--styles/lucee/images/logo-luxoft.png4
-rw-r--r--styles/lucee/images/logo-theqtcompany.png4
-rw-r--r--styles/lucee/images/luxoft-footer.png4
-rw-r--r--styles/lucee/style.conf2
-rw-r--r--styles/neptune/Button.qml4
-rw-r--r--styles/neptune/ItemDelegate.qml4
-rw-r--r--styles/neptune/RadioButton.qml4
-rw-r--r--styles/neptune/Switch.qml4
-rw-r--r--styles/neptune/SwitchDelegate.qml6
-rw-r--r--styles/neptune/TabButton.qml3
-rw-r--r--styles/neptune/ToolButton.qml24
-rw-r--r--styles/neptune/images/colorSelector/#087559.png4
-rw-r--r--styles/neptune/images/colorSelector/#417eb6.png4
-rw-r--r--styles/neptune/images/colorSelector/#4c878b.png4
-rw-r--r--styles/neptune/images/colorSelector/#4f4c4a.png4
-rw-r--r--styles/neptune/images/colorSelector/#51a7f4.png4
-rw-r--r--styles/neptune/images/colorSelector/#535258.png4
-rw-r--r--styles/neptune/images/colorSelector/#698563.png4
-rw-r--r--styles/neptune/images/colorSelector/#78887b.png4
-rw-r--r--styles/neptune/images/colorSelector/#7ba2a5.png4
-rw-r--r--styles/neptune/images/colorSelector/#916755.png4
-rw-r--r--styles/neptune/images/colorSelector/#977b35.png4
-rw-r--r--styles/neptune/images/colorSelector/#9eae83.png4
-rw-r--r--styles/neptune/images/colorSelector/#b75034.png4
-rw-r--r--styles/neptune/images/colorSelector/#d35756.png4
-rw-r--r--styles/neptune/images/colorSelector/#db3b9f.png4
-rw-r--r--styles/neptune/images/colorSelector/#fba054.png4
-rw-r--r--styles/neptune/images/colorSelector/color-wheel-dark.png4
-rw-r--r--styles/neptune/images/colorSelector/color-wheel.png4
-rw-r--r--styles/neptune/images/instrument-cluster-bg-dark.png4
-rw-r--r--styles/neptune/images/logo-kdab-dark.png3
-rw-r--r--styles/neptune/images/logo-kdab.png4
-rw-r--r--styles/neptune/images/logo-luxoft-dark.png3
-rw-r--r--styles/neptune/images/logo-luxoft.png4
-rw-r--r--styles/neptune/images/logo-theqtcompany-dark.png3
-rw-r--r--styles/neptune/images/logo-theqtcompany.png4
-rw-r--r--styles/neptune/style.conf3
-rw-r--r--sysui/about/About.qml16
-rw-r--r--sysui/about/AboutApps.qml213
-rw-r--r--sysui/centerconsole/+lucee/CenterConsole.qml4
-rw-r--r--sysui/centerconsole/AbstractCenterConsole.qml78
-rw-r--r--sysui/centerconsole/ApplicationPopup.qml31
-rw-r--r--sysui/centerconsole/ApplicationPopups.qml2
-rw-r--r--sysui/centerconsole/CenterConsole.qml32
-rw-r--r--sysui/centerconsole/CenterConsoleWindow.qml67
-rw-r--r--sysui/centerconsole/GamePadController.qml39
-rw-r--r--sysui/centerconsole/MainContentArea.qml17
-rw-r--r--sysui/centerconsole/UIShortcuts.qml6
-rw-r--r--sysui/centerconsole/VirtualKeyboard.qml18
-rw-r--r--sysui/centerconsole/WidgetDrawer.qml58
-rw-r--r--sysui/home/+lucee/ApplicationWidget.qml6
-rw-r--r--sysui/home/AddWidgetPopupLoader.qml18
-rw-r--r--sysui/home/ApplicationWidget.qml28
-rw-r--r--sysui/home/WidgetGrid.qml14
-rw-r--r--sysui/instrumentcluster/ApplicationICWindows.qml6
-rw-r--r--sysui/instrumentcluster/InstrumentClusterWindow.qml102
-rw-r--r--sysui/launcher/+lucee/AppIcon.qml3
-rw-r--r--sysui/launcher/EditableGridView.qml114
-rw-r--r--sysui/launcher/Launcher.qml28
-rw-r--r--sysui/notification/NotificationCenter.qml163
-rw-r--r--sysui/notification/NotificationContent.qml52
-rw-r--r--sysui/notification/NotificationHandle.qml154
-rw-r--r--sysui/notification/NotificationToast.qml4
-rw-r--r--sysui/statusbar/+lucee/StatusBar.qml9
-rw-r--r--sysui/stores/ClusterStore.qml19
-rw-r--r--sysui/stores/MusicAppRequestsIPCStore.qml4
-rw-r--r--sysui/stores/MusicStore.qml47
-rw-r--r--sysui/stores/RootStore.qml117
-rw-r--r--sysui/stores/VolumeStore.qml7
-rw-r--r--tests/dummyimports/QtApplicationManager/SystemUI/WindowManager.qml2
-rw-r--r--tests/neptune-qmlscene/neptune-qmlscene.cpp6
-rw-r--r--tests/qmltests/qmltests.pro7
-rw-r--r--tests/qmltests/testrunner.cpp4
-rw-r--r--win32/server.conf3
592 files changed, 12511 insertions, 3459 deletions
diff --git a/.gitattributes b/.gitattributes
index 41bf18d0..f28e2bfc 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,4 +1,5 @@
*.png filter=lfs diff=lfs merge=lfs -text
+*.svg filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.otf filter=lfs diff=lfs merge=lfs -text
*.dds filter=lfs diff=lfs merge=lfs -text
diff --git a/.lfsconfig b/.lfsconfig
deleted file mode 100644
index 252d8e29..00000000
--- a/.lfsconfig
+++ /dev/null
@@ -1,2 +0,0 @@
-[lfs]
-url = https://git-lfs.qt.io/Gerrit/neptune3-ui.git/info/lfs
diff --git a/.qmake.conf b/.qmake.conf
index cde5fc4d..73e24cde 100644
--- a/.qmake.conf
+++ b/.qmake.conf
@@ -1,4 +1,4 @@
-MODULE_VERSION = 5.13.1
+MODULE_VERSION = 5.15.1
# force_independent can be set externally. prefix_build not.
# This is needed to make sure behaves like in the other qt modules
diff --git a/Main.qml b/Main.qml
index 72e405db..8d507c7f 100644
--- a/Main.qml
+++ b/Main.qml
@@ -40,6 +40,7 @@ import instrumentcluster 1.0
import hud 1.0
import stores 1.0
+import shared.utils 1.0
import shared.Style 1.0
QtObject {
@@ -123,6 +124,14 @@ QtObject {
readonly property CenterConsoleWindow centerConsoleWindow: CenterConsoleWindow {
store: root.store
- }
+ onNextICAppIsRequested: {
+ if (instrumentClusterWindowLoader.active && !!instrumentClusterWindowLoader.item) {
+ instrumentClusterWindowLoader.item.nextApplicationICWindow();
+ }
+ }
+ TouchPointsTracer {
+ target: centerConsoleWindow
+ }
+ }
}
diff --git a/README.md b/README.md
index 3dea8005..13eea259 100644
--- a/README.md
+++ b/README.md
@@ -13,14 +13,12 @@ You can run Neptune 3 UI in one of two ways:
Both these options are described in: https://doc.qt.io/Neptune3UI/neptune3ui-install.html
#### Note
-> Neptune 3 UI contains many garphic assets that are updated regularly. This requires the use of
-> git-lfs. Make sure to install [https://git-lfs.github.com/](git-lfs) first. Neptune 3 UI's
-> repository configuration has been extended to host some type of assets on
-> https://git-lfs.qt.io/, in GitLab. The Qt Company runs this server and provides anonymous read
-> access so that developers can clone the code without an account. However, submitting code
-> requires both, an account and membership in the `Gerrit` group. Use the git credentials cache to
-> avoid having to enter your credentials each time you push a commit. The GitLab server uses a
-> self-signed certification, so you need to override the SSL verification with the following
+> Neptune 3 UI contains many graphic assets that are updated regularly. This requires the use of
+> git-lfs. Make sure to install [https://git-lfs.github.com/](git-lfs) first. The Qt Company runs
+> the git-lfs server and provides anonymous read access so that developers can clone the code without
+> an account. Use the git credentials cache to avoid having to enter your credentials each time
+> you push a commit. The GitLab server uses a self-signed certification, so you need to override
+> the SSL verification with the following
> commands:
> $ git lfs install
> $ git clone git://code.qt.io/qt-apps/neptune3-ui.git
@@ -40,9 +38,9 @@ System UI acts as a Wayland server, compositing the application windows in its o
regular QML items.
* a Linux installation
-* Qt5 (branch 5.13) with qtwayland submodule and built with Open GL ES (-opengl es2 -opengles3)
-* QtIvi (git://code.qt.io/qt/qtivi.git, branch 5.13)
-* Qt Application Manager (git://code.qt.io/qt/qtapplicationmanager.git, branch 5.13)
+* Qt5 (branch 5.15) with qtwayland submodule and built with Open GL ES (-opengl es2 -opengles3)
+* QtIvi (git://code.qt.io/qt/qtivi.git, branch 5.15)
+* Qt Application Manager (git://code.qt.io/qt/qtapplicationmanager.git, branch 5.15)
### Single-process UI (fallback option)
@@ -50,6 +48,6 @@ In single-process mode, all application code run in one process, which is the sa
process as the System UI itself.
* a Linux, Windows, or macOS installation
-* Qt5 (branch 5.13)
-* QtIvi (git://code.qt.io/qt/qtivi.git, branch 5.13)
-* Qt Application Manager (git://code.qt.io/qt/qtapplicationmanager.git, branch 5.13)
+* Qt5 (branch 5.15)
+* QtIvi (git://code.qt.io/qt/qtivi.git, branch 5.15)
+* Qt Application Manager (git://code.qt.io/qt/qtapplicationmanager.git, branch 5.15)
diff --git a/am-config-android.yaml b/am-config-android.yaml
index 6adce907..f195a0ed 100644
--- a/am-config-android.yaml
+++ b/am-config-android.yaml
@@ -6,7 +6,3 @@ formatType: am-configuration
applications:
builtinAppsManifestDir: "${CONFIG_PWD}/apps"
installedAppsManifestDir: ~
- appImageMountDir: ~
- database: "am/apps.db"
-
-installationLocations: ~
diff --git a/am-config-lucee.yaml b/am-config-lucee.yaml
index d78860d5..747d5116 100644
--- a/am-config-lucee.yaml
+++ b/am-config-lucee.yaml
@@ -8,8 +8,8 @@ formatType: am-configuration
applications:
builtinAppsManifestDir: "${CONFIG_PWD}/apps"
installedAppsManifestDir: "${stdpath:AppLocalDataLocation}/neptune3-ui/manifests"
- appImageMountDir: "${stdpath:AppLocalDataLocation}/neptune3-ui/image-mounts"
- database: "${stdpath:AppLocalDataLocation}/neptune3-ui/apps.db"
+ installationDir: "${stdpath:AppLocalDataLocation}/neptune3-ui/apps"
+ documentDir: "${stdpath:AppLocalDataLocation}/neptune3-ui/docs"
# QML apps will be able to import from modules...
@@ -17,14 +17,14 @@ runtimes:
qml:
importPaths: [ "${CONFIG_PWD}/imports_shared" ]
environmentVariables:
- QT_PLUGIN_PATH: ${CONFIG_PWD}
- SERVER_CONF_PATH: ${CONFIG_PWD}/server.conf
+ QT_PLUGIN_PATH: "${CONFIG_PWD}"
+ SERVER_CONF_PATH: "${CONFIG_PWD}/server.conf"
QT_FILE_SELECTORS: lucee
native:
importPaths: [ "${CONFIG_PWD}/imports_shared" ]
environmentVariables:
- QT_PLUGIN_PATH: ${CONFIG_PWD}
- SERVER_CONF_PATH: ${CONFIG_PWD}/server.conf
+ QT_PLUGIN_PATH: "${CONFIG_PWD}"
+ SERVER_CONF_PATH: "${CONFIG_PWD}/server.conf"
QT_FILE_SELECTORS: lucee
# ... as well as the SystemUI
@@ -52,7 +52,7 @@ systemProperties:
qsrServerPort: '1111'
showSystemAppsInLauncher: no
private:
- appStoreServerUrl: 'http://chaos.pelagicore.net:9090'
+ appStoreServerUrl: 'http://demoappsdeploy.qt.io:8514'
userName: 't'
userPassword: 't'
imei: '112163001487801'
@@ -65,11 +65,17 @@ flags:
noSecurity: yes
noUiWatchdog: yes
-# simulate an internal and a SD-card installation location
+# default logging
-installationLocations:
-- id: "internal-0"
- installationPath: "${stdpath:AppLocalDataLocation}/neptune3-ui/apps"
- documentPath: "${stdpath:AppLocalDataLocation}/neptune3-ui/docs"
- mountPoint: "${stdpath:AppLocalDataLocation}"
- isDefault: true
+logging:
+ rules:
+ - "*=false"
+ - "qt.*=false"
+ - "qt.gamepad*=true"
+ - "am.*=false"
+ - "qml*=true"
+ - "cursor.navigation=false"
+ - "qt3ds.*=false"
+ - "shared.com.pelagicore.map.info=false"
+ - "*.warning=false"
+ - "*.critical=true"
diff --git a/am-config-neptune.yaml b/am-config-neptune.yaml
index 96699d9b..cc17eb7b 100644
--- a/am-config-neptune.yaml
+++ b/am-config-neptune.yaml
@@ -8,8 +8,8 @@ formatType: am-configuration
applications:
builtinAppsManifestDir: "${CONFIG_PWD}/apps"
installedAppsManifestDir: "${stdpath:AppLocalDataLocation}/neptune3-ui/manifests"
- appImageMountDir: "${stdpath:AppLocalDataLocation}/neptune3-ui/image-mounts"
- database: "${stdpath:AppLocalDataLocation}/neptune3-ui/apps.db"
+ installationDir: "${stdpath:AppLocalDataLocation}/neptune3-ui/apps"
+ documentDir: "${stdpath:AppLocalDataLocation}/neptune3-ui/docs"
# QML apps will be able to import from modules...
@@ -17,13 +17,13 @@ runtimes:
qml:
importPaths: [ "${CONFIG_PWD}/imports_shared" ]
environmentVariables:
- QT_PLUGIN_PATH: ${CONFIG_PWD}
- SERVER_CONF_PATH: ${CONFIG_PWD}/server.conf
+ QT_PLUGIN_PATH: "${CONFIG_PWD}"
+ SERVER_CONF_PATH: "${CONFIG_PWD}/server.conf"
native:
importPaths: [ "${CONFIG_PWD}/imports_shared" ]
environmentVariables:
- QT_PLUGIN_PATH: ${CONFIG_PWD}
- SERVER_CONF_PATH: ${CONFIG_PWD}/server.conf
+ QT_PLUGIN_PATH: "${CONFIG_PWD}"
+ SERVER_CONF_PATH: "${CONFIG_PWD}/server.conf"
# ... as well as the SystemUI
@@ -50,7 +50,7 @@ systemProperties:
qsrServerPort: '1111'
showSystemAppsInLauncher: no
private:
- appStoreServerUrl: 'http://chaos.pelagicore.net:9090'
+ appStoreServerUrl: 'http://demoappsdeploy.qt.io:8514'
userName: 't'
userPassword: 't'
imei: '112163001487801'
@@ -69,16 +69,11 @@ logging:
rules:
- "*=false"
- "qt.*=false"
+ - "qt.gamepad*=true"
- "am.*=false"
- "qml*=true"
- - "*.warning=true"
+ - "cursor.navigation=false"
+ - "qt3ds.*=false"
+ - "shared.com.pelagicore.map.info=false"
+ - "*.warning=false"
- "*.critical=true"
-
-# simulate an internal and a SD-card installation location
-
-installationLocations:
-- id: "internal-0"
- installationPath: "${stdpath:AppLocalDataLocation}/neptune3-ui/apps"
- documentPath: "${stdpath:AppLocalDataLocation}/neptune3-ui/docs"
- mountPoint: "${stdpath:AppLocalDataLocation}"
- isDefault: true
diff --git a/apps/com.luxoft.vehicle/3d/entities/Body.qml b/apps/com.luxoft.vehicle/3d/entities/Body.qml
index be703d5d..c0d9bd92 100644
--- a/apps/com.luxoft.vehicle/3d/entities/Body.qml
+++ b/apps/com.luxoft.vehicle/3d/entities/Body.qml
@@ -46,13 +46,13 @@ Entity {
&& license_platesReady && frontLightsReady && taillightsReady && interiorReady
property bool chromeReady: mesh.status === Mesh.Ready
- property bool shellReady: mesh.status === Mesh.Ready
- property bool matt_blackReady: mesh.status === Mesh.Ready
- property bool glassReady: mesh.status === Mesh.Ready
- property bool license_platesReady: mesh.status === Mesh.Ready
- property bool frontLightsReady: mesh.status === Mesh.Ready
- property bool taillightsReady: mesh.status === Mesh.Ready
- property bool interiorReady: mesh.status === Mesh.Ready
+ property bool shellReady: shell.status === Mesh.Ready
+ property bool matt_blackReady: matt_black.status === Mesh.Ready
+ property bool glassReady: glass.status === Mesh.Ready
+ property bool license_platesReady: license_plates.status === Mesh.Ready
+ property bool frontLightsReady: interior.status === Mesh.Ready
+ property bool taillightsReady: taillights.status === Mesh.Ready
+ property bool interiorReady: interior.status === Mesh.Ready
property string version
diff --git a/apps/com.luxoft.vehicle/3d/entities/CameraController.qml b/apps/com.luxoft.vehicle/3d/entities/CameraController.qml
deleted file mode 100644
index 6db6491b..00000000
--- a/apps/com.luxoft.vehicle/3d/entities/CameraController.qml
+++ /dev/null
@@ -1,127 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 Luxoft Sweden AB
-** Copyright (C) 2018 Pelagicore AG
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Neptune 3 UI.
-**
-** $QT_BEGIN_LICENSE:GPL-QTAS$
-** Commercial License Usage
-** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** 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 Qt3D.Core 2.0
-import Qt3D.Render 2.0
-import Qt3D.Input 2.0
-import Qt3D.Logic 2.0
-import QtQml 2.2
-
-
-Entity {
- id: root
- property Camera camera
- property real cameraPanAngle: 0.0
-
- QtObject {
- id: d
- readonly property vector2d base2d : Qt.vector2d(0.0, -15.0)
- property real pixelAndTimeMagicCoeff: 7.0
- property var trajectory: []
- property bool userInteraction: false
-
- // represents counter for rotation, when it lower than 360 car will be rotated for delta (360 - demoRotation)
- property int demoRotation: 360
- property Timer demoTimer: Timer {
- interval: 60000
- repeat: true
- running: root.enabled
- onTriggered: {
- d.demoRotation = 0
- }
- }
- }
-
- function getCurrentAngle() {
- var viewVec3d = root.camera.viewVector
- var vec2d = Qt.vector2d(viewVec3d.x, viewVec3d.z);
- var angle = 0.0;
- if (!vec2d.fuzzyEquals(d.base2d)) {
- var dot = vec2d.x*d.base2d.x + vec2d.y*d.base2d.y;
- var det = vec2d.x*d.base2d.y - vec2d.y*d.base2d.x;
- angle = Math.atan2(det, dot);
- }
-
- return angle * 180 / Math.PI;
- }
-
- MouseDevice {
- id: mouseSourceDevice
- sensitivity: 0.1
- }
-
- MouseHandler {
- id: mouseHandler
- sourceDevice: mouseSourceDevice
- onPositionChanged: {
- d.trajectory.push(mouse.x);
- }
-
- onPressed: {
- d.trajectory = [];
- d.userInteraction = true;
- d.demoRotation = 360;
- d.demoTimer.running = false;
- }
-
- onReleased: {
- d.userInteraction = false;
- d.demoTimer.running = true;
- }
- }
-
- components: [
- FrameAction {
- onTriggered: {
- if (d.userInteraction && dt && d.trajectory.length > 2) {
- var dx = 0
- for (var i = 1; i < d.trajectory.length; ++i) {
- dx += d.trajectory[i] - d.trajectory[i - 1];
- }
-
- if (dx !== 0) {
- root.camera.panAboutViewCenter(-dx * dt * d.pixelAndTimeMagicCoeff
- , Qt.vector3d(0, 1, 0));
- cameraPanAngle = getCurrentAngle();
- }
-
- d.trajectory = []
- } else if (!d.userInteraction && d.demoRotation < 360) {
- ++d.demoRotation;
- root.camera.panAboutViewCenter(-1.0, Qt.vector3d(0, 1, 0));
- cameraPanAngle = getCurrentAngle();
- }
-
- }
- }
- ]
-}
diff --git a/apps/com.luxoft.vehicle/3d/entities/Roof.qml b/apps/com.luxoft.vehicle/3d/entities/Roof.qml
index a51b6869..218db839 100644
--- a/apps/com.luxoft.vehicle/3d/entities/Roof.qml
+++ b/apps/com.luxoft.vehicle/3d/entities/Roof.qml
@@ -47,16 +47,13 @@ Entity {
// 0.0 fully closed, 1.0 fully open
property real openProgress: 0.0
property string version
+ Behavior on openProgress { DefaultNumberAnimation { duration: 1000 } }
Transform {
id: transform
readonly property real translationZ: -1.15
- matrix: {
- var m = Qt.matrix4x4();
- m.translate(Qt.vector3d(0, 0, translationZ * openProgress));
- m.scale(Qt.vector3d(1, 1, 1 - openProgress));
- return m;
- }
+ translation: Qt.vector3d(0, 0, translationZ * openProgress)
+ scale3D: Qt.vector3d(1, 1, 1 - openProgress)
}
Mesh {
diff --git a/apps/com.luxoft.vehicle/3d/entities/qmldir b/apps/com.luxoft.vehicle/3d/entities/qmldir
index 1b278545..f8671fd8 100644
--- a/apps/com.luxoft.vehicle/3d/entities/qmldir
+++ b/apps/com.luxoft.vehicle/3d/entities/qmldir
@@ -4,7 +4,6 @@ Roof 1.0 Roof.qml
RightDoor 1.0 RightDoor.qml
RearDoor 1.0 RearDoor.qml
LeftDoor 1.0 LeftDoor.qml
-CameraController 1.0 CameraController.qml
Body 1.0 Body.qml
AxisRear 1.0 AxisRear.qml
AxisFront 1.0 AxisFront.qml
diff --git a/apps/com.luxoft.vehicle/Main.qml b/apps/com.luxoft.vehicle/Main.qml
index 48a5f1f6..edbfb6d5 100644
--- a/apps/com.luxoft.vehicle/Main.qml
+++ b/apps/com.luxoft.vehicle/Main.qml
@@ -54,6 +54,7 @@ QtObject {
visible: mainWindow.neptuneState === "Maximized"
store: VehicleStore {
vehicle3DstudioColor: Style.accentColor
+ onRequestRaiseAppReceived: { mainWindow.riseWindow(); }
}
}
@@ -62,24 +63,5 @@ QtObject {
vehicleView.store.vehicle3DstudioColor = Style.accentColor
}
}
-
- InstrumentCluster {
- id: clusterSettings
- }
- }
-
- readonly property Loader applicationICWindowLoader: Loader {
- asynchronous: true
- active: clusterSettings.available
- || Qt.platform.os !== "linux" // FIXME and then remove; remote settings doesn't really work outside of Linux
- sourceComponent: Component {
- ApplicationICWindow {
- id: applicationICWindowComponent
- VehicleICView {
- anchors.fill: parent
- store: vehicleView.store
- }
- }
- }
}
}
diff --git a/apps/com.luxoft.vehicle/MainIC.qml b/apps/com.luxoft.vehicle/MainIC.qml
new file mode 100644
index 00000000..0291073b
--- /dev/null
+++ b/apps/com.luxoft.vehicle/MainIC.qml
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.13
+import QtQuick.Controls 2.2
+
+import application.windows 1.0
+
+import "views" 1.0
+import "stores" 1.0
+
+ApplicationICWindow {
+ id: root
+ VehicleICView {
+ id: vehicleView
+ anchors.fill: parent
+ store: VehicleStoreIC {}
+ }
+}
diff --git a/apps/com.luxoft.vehicle/assets/3dCar/materials/Brushed_Chrome_0002.materialdef b/apps/com.luxoft.vehicle/assets/3dCar/materials/Brushed_Chrome_0002.materialdef
index de26e38f..d34d6fda 100644
--- a/apps/com.luxoft.vehicle/assets/3dCar/materials/Brushed_Chrome_0002.materialdef
+++ b/apps/com.luxoft.vehicle/assets/3dCar/materials/Brushed_Chrome_0002.materialdef
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:563f1905fd1c85545635deb0602a5a6b4c6562f171f113b41f7535809eedf269
-size 1299
+oid sha256:f0d5850fc949d7bd032d4deb085cc50f1c5d3fcc42c0a487de52d2e53abf4e62
+size 1338
diff --git a/apps/com.luxoft.vehicle/assets/3dCar/materials/Coloured_Glass11.materialdef b/apps/com.luxoft.vehicle/assets/3dCar/materials/Coloured_Glass11.materialdef
index 76302a60..0b4ccf69 100644
--- a/apps/com.luxoft.vehicle/assets/3dCar/materials/Coloured_Glass11.materialdef
+++ b/apps/com.luxoft.vehicle/assets/3dCar/materials/Coloured_Glass11.materialdef
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:92dd131009808a238e0cf5d19c193d2c70af84f85330047cee462846a825b38f
-size 1302
+oid sha256:b8f347d986441ef732d5e73c4afdaabe06801abb597abb9f9161fe481338c8e2
+size 1341
diff --git a/apps/com.luxoft.vehicle/assets/3dCar/materials/Int_panel_plastic_matte_111.materialdef b/apps/com.luxoft.vehicle/assets/3dCar/materials/Int_panel_plastic_matte_111.materialdef
index 4506e5a1..641a48c1 100644
--- a/apps/com.luxoft.vehicle/assets/3dCar/materials/Int_panel_plastic_matte_111.materialdef
+++ b/apps/com.luxoft.vehicle/assets/3dCar/materials/Int_panel_plastic_matte_111.materialdef
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a8b76fcda693ff2cdb15e053c4fbed6139f4c3fc3ccea14789d4a102ee960d99
-size 1322
+oid sha256:af1b779130e10a94a55855cc0aafd54a9a545277373b88d3de654f951d6fae1c
+size 1361
diff --git a/apps/com.luxoft.vehicle/assets/3dCar/materials/Rubber_-_Black_001.materialdef b/apps/com.luxoft.vehicle/assets/3dCar/materials/Rubber_-_Black_001.materialdef
index 17015fba..e9c3daf6 100644
--- a/apps/com.luxoft.vehicle/assets/3dCar/materials/Rubber_-_Black_001.materialdef
+++ b/apps/com.luxoft.vehicle/assets/3dCar/materials/Rubber_-_Black_001.materialdef
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:99f42f7015f042f239c980efb60d1ce5644a71e7b0720244b6e0372ce91d68fb
-size 1297
+oid sha256:508cf6538401b00a5f4bcdcbd773f5ca81a5612868c8a9baca7e855773e3a76a
+size 1336
diff --git a/apps/com.luxoft.vehicle/assets/3dCar/materials/Simple_Glass_111.materialdef b/apps/com.luxoft.vehicle/assets/3dCar/materials/Simple_Glass_111.materialdef
index 7897b2ec..c6eca7db 100644
--- a/apps/com.luxoft.vehicle/assets/3dCar/materials/Simple_Glass_111.materialdef
+++ b/apps/com.luxoft.vehicle/assets/3dCar/materials/Simple_Glass_111.materialdef
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:66b6b40efe98ac1df01b2ba7e67e8811ba0b84fe9cb6d44a7d802691f63c6c29
-size 1306
+oid sha256:d0bb2b46b4cc06f29c31ebd7cd6741a004928cf6475f4e8630c41280239d9e02
+size 1345
diff --git a/apps/com.luxoft.vehicle/assets/3dCar/materials/leicht_metalic_110.materialdef b/apps/com.luxoft.vehicle/assets/3dCar/materials/leicht_metalic_110.materialdef
index 45142adb..e4a3c6e6 100644
--- a/apps/com.luxoft.vehicle/assets/3dCar/materials/leicht_metalic_110.materialdef
+++ b/apps/com.luxoft.vehicle/assets/3dCar/materials/leicht_metalic_110.materialdef
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:382d9c7a7a990fbe03bbd056bc4104f41a2a9bf3218d65d12f5bd2d47187ab58
-size 2242
+oid sha256:34beb7bfbf232f6686ec81578c87eb62dab6a62951d1d7f612461e94591721c9
+size 2281
diff --git a/apps/com.luxoft.vehicle/assets/3dCar/materials/rear_tires11.materialdef b/apps/com.luxoft.vehicle/assets/3dCar/materials/rear_tires11.materialdef
index 86c48b7e..a92e99f1 100644
--- a/apps/com.luxoft.vehicle/assets/3dCar/materials/rear_tires11.materialdef
+++ b/apps/com.luxoft.vehicle/assets/3dCar/materials/rear_tires11.materialdef
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a7bba8703a3c4db66aa3403991c78f754aae0c16e4cc7fdc0ae10f30339aaa7b
-size 1273
+oid sha256:825788a21728cc4be5459606f61f8935a76bb1212f9fbe043bf6719f3908b637
+size 1312
diff --git a/apps/com.luxoft.vehicle/assets/3dCar/materials/seats_111.materialdef b/apps/com.luxoft.vehicle/assets/3dCar/materials/seats_111.materialdef
index aa200e65..f680a68e 100644
--- a/apps/com.luxoft.vehicle/assets/3dCar/materials/seats_111.materialdef
+++ b/apps/com.luxoft.vehicle/assets/3dCar/materials/seats_111.materialdef
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4898ff582519626d0f11889d63e9981ec85ef1bec8340380ab06cc0cf6be05fd
-size 1268
+oid sha256:91588fa03efa0924b60c65d9519d4999dd62fe10f56cc398f3002fda7877832f
+size 1307
diff --git a/apps/com.luxoft.vehicle/assets/3dCar/materials/shell.inside_Diffuse_Default.materialdef b/apps/com.luxoft.vehicle/assets/3dCar/materials/shell.inside_Diffuse_Default.materialdef
new file mode 100644
index 00000000..386065f7
--- /dev/null
+++ b/apps/com.luxoft.vehicle/assets/3dCar/materials/shell.inside_Diffuse_Default.materialdef
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d4f11bec2bb576c12e6f0851543f6cbbaa05a5edb37e4a8dfd121dd12726122e
+size 1376
diff --git a/apps/com.luxoft.vehicle/assets/3dCar/models/car/meshes/shell.mesh b/apps/com.luxoft.vehicle/assets/3dCar/models/car/meshes/shell.mesh
index ee917732..99b06372 100644
--- a/apps/com.luxoft.vehicle/assets/3dCar/models/car/meshes/shell.mesh
+++ b/apps/com.luxoft.vehicle/assets/3dCar/models/car/meshes/shell.mesh
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:0734d654266ae7b40ac4dcbd3720fda58ccb767f5375a789eea6f8a4d9c00988
-size 76244616
+oid sha256:780d87a8c5c54bcc955f733cd99bc530a8e84cb08ae3e66f192c44787def0ae1
+size 36360424
diff --git a/apps/com.luxoft.vehicle/assets/3dCar/models/shell inside/meshes/shell.inside.mesh b/apps/com.luxoft.vehicle/assets/3dCar/models/shell inside/meshes/shell.inside.mesh
new file mode 100644
index 00000000..21cd53df
--- /dev/null
+++ b/apps/com.luxoft.vehicle/assets/3dCar/models/shell inside/meshes/shell.inside.mesh
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bd5f439e57726ff355165de57a9fa53ec2874ba0fc8bb2c6417259052d76022d
+size 35982404
diff --git a/apps/com.luxoft.vehicle/assets/3dCar/models/shell inside/shell inside.import b/apps/com.luxoft.vehicle/assets/3dCar/models/shell inside/shell inside.import
new file mode 100644
index 00000000..84936867
--- /dev/null
+++ b/apps/com.luxoft.vehicle/assets/3dCar/models/shell inside/shell inside.import
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<UIP Version="1" >
+ <Project Revision="1" >
+ <Graph >
+ <Group id="__import__root__" >
+ <Model id="shell.inside" name="shell.inside" orientation="Right Handed" position="0 0 0" rotation="2.50448e-06 0 0" rotationorder="XYZr" scale="99 99 99" sourcepath="meshes/shell.inside.mesh" >
+ <Material id="shell.inside_Diffuse_Default" name="shell.inside_Diffuse_Default" blendmode="Normal" diffuse="0.8 0.8 0.8 1" emissivepower="0" opacity="100" specularamount="0" />
+ </Model>
+ </Group>
+ </Graph>
+ <Import SrcFile="../../../../blenderWork/shell inside.fbx" ImageDir="maps" MeshDir="meshes" >
+ <Mesh >
+ <Source >shell.inside</Source>
+ <Dest >meshes/shell.inside.mesh</Dest>
+ </Mesh>
+ </Import>
+ </Project>
+</UIP>
diff --git a/apps/com.luxoft.vehicle/assets/3dCar/presentations/vehicle3dStudio.uip b/apps/com.luxoft.vehicle/assets/3dCar/presentations/vehicle3dStudio.uip
index c2d54f7b..c27f6a2f 100644
--- a/apps/com.luxoft.vehicle/assets/3dCar/presentations/vehicle3dStudio.uip
+++ b/apps/com.luxoft.vehicle/assets/3dCar/presentations/vehicle3dStudio.uip
@@ -1,222 +1,232 @@
<?xml version="1.0" encoding="UTF-8" ?>
-<UIP version="3" >
+<UIP version="6" >
<Project >
<ProjectSettings author="" company="" presentationWidth="960" presentationHeight="380" maintainAspect="False" preferKtx="False" >
<CustomColors count="16" >#ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff</CustomColors>
</ProjectSettings>
<BufferData >
- <ImageBuffer sourcepath="../assets/back.png" hasTransparency="True" />
+ <ImageBuffer sourcepath="../assets/back.png" hasTransparency="True" hasOpaquePixels="True" />
<ImageBuffer sourcepath="../assets/shadow.png" hasTransparency="True" />
</BufferData>
<Graph >
- <Scene id="Scene" backgroundcolor="1 1 1" bgcolorenable="False" >
- <Layer id="Layer" >
- <Group id="car" importid="__import__root__" >
- <Light id="Sun2" name="Sun" brightness="100" castshadow="False" importid="Sun" lightdiffuse="1 1 1" lighttype="Directional" orientation="Right Handed" position="0 0 -0" rotation="0 -0 0" rotationorder="XYZr" scale="1 1 1" />
+ <Scene id="Scene_u47912" backgroundcolor="1 1 1 1" bgcolorenable="False" >
+ <Layer id="Layer_u2391" variants="" >
+ <Group id="car_u30032" variants="" importid="__import__root__" >
+ <Light id="Sun2_u45404" name="Sun" brightness="100" castshadow="False" importid="Sun" lightdiffuse="1 1 1 1" lighttype="Directional" orientation="Right Handed" position="0 0 0" rotation="0 0 0" rotationorder="XYZr" scale="1 1 1" />
</Group>
- <Group id="car_001" importid="__import__root__" >
- <Group id="dleft" importid="__import__root__" >
- <Model id="silver_paint_1" name="silver_paint_1" importid="silver_paint_1" orientation="Right Handed" position="0 0 -0" rotation="2.50448e-06 -89.849 1.22136e-11" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/dleft/meshes/silver_paint_1.mesh" >
- <ReferencedMaterial id="leicht_metalic_005" />
+ <Group id="car_u52433" variants="" importid="__import__root__" >
+ <Group id="dleft_u43675" variants="" importid="__import__root__" >
+ <Model id="silver_paint_u16963" variants="" name="silver_paint_1" importid="silver_paint_1" orientation="Right Handed" position="0 0 0" rotation="2.50448e-06 -89.849 1.22136e-11" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/dleft/meshes/silver_paint_1.mesh" >
+ <ReferencedMaterial id="leicht_metalic_u23326" />
</Model>
- <Model id="glass" name="glass" importid="glass" orientation="Right Handed" position="0 0 -0" rotation="0.0257134 -89.949 1.65707e-06" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/dleft/meshes/glass.mesh" >
- <ReferencedMaterial id="Simple_Glass_005" />
+ <Model id="glass_u25383" variants="" name="glass" importid="glass" orientation="Right Handed" position="0 0 0" rotation="0.0257134 -89.949 1.65707e-06" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/dleft/meshes/glass.mesh" >
+ <ReferencedMaterial id="Simple_Glass_u35068" />
</Model>
- <Model id="chrome_2" name="chrome_2" importid="chrome_2" orientation="Right Handed" position="0 0 -0" rotation="0.0257134 -89.949 1.65707e-06" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/dleft/meshes/chrome_2.mesh" >
- <ReferencedMaterial id="Brushed_Chrome_006" />
+ <Model id="chrome_u60341" variants="" name="chrome_2" importid="chrome_2" orientation="Right Handed" position="0 0 0" rotation="0.0257134 -89.949 1.65707e-06" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/dleft/meshes/chrome_2.mesh" >
+ <ReferencedMaterial id="Brushed_Chrome_u34791" />
</Model>
- <Model id="black_1" name="black_1" importid="black_1" orientation="Right Handed" position="0 0 -0" rotation="0.0257134 -89.949 1.65707e-06" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/dleft/meshes/black_1.mesh" >
- <ReferencedMaterial id="Int_panel_plastic_matte_003" />
+ <Model id="black_u41716" variants="" name="black_1" importid="black_1" orientation="Right Handed" position="0 0 0" rotation="0.0257134 -89.949 1.65707e-06" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/dleft/meshes/black_1.mesh" >
+ <ReferencedMaterial id="Int_panel_plastic_matte_u45799" />
</Model>
</Group>
- <Group id="dr_001" importid="__import__root__" >
- <Model id="silver_paint_2" name="silver_paint_2" importid="silver_paint_2" orientation="Right Handed" position="0 0 -0" rotation="-180 -89.9977 180" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/dr/meshes/silver_paint_2.mesh" >
- <ReferencedMaterial id="leicht_metalic_006" />
+ <Group id="dr_u56297" variants="" importid="__import__root__" >
+ <Model id="silver_paint_u10921" variants="" name="silver_paint_2" importid="silver_paint_2" orientation="Right Handed" position="0 0 0" rotation="-180 -89.9977 180" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/dr/meshes/silver_paint_2.mesh" >
+ <ReferencedMaterial id="leicht_metalic_u11104" />
</Model>
- <Model id="glass_2" name="glass_2" importid="glass_2" orientation="Right Handed" position="0 0 -0" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/dr/meshes/glass_2.mesh" >
- <ReferencedMaterial id="Simple_Glass_006" />
+ <Model id="glass_u28544" variants="" name="glass_2" importid="glass_2" orientation="Right Handed" position="0 0 0" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/dr/meshes/glass_2.mesh" >
+ <ReferencedMaterial id="Simple_Glass_u57408" />
</Model>
- <Model id="chrome_3" name="chrome_3" importid="chrome_3" orientation="Right Handed" position="0 0 -0" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/dr/meshes/chrome_3.mesh" >
- <ReferencedMaterial id="Brushed_Chrome_007" />
+ <Model id="chrome_u32682" variants="" name="chrome_3" importid="chrome_3" orientation="Right Handed" position="0 0 0" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/dr/meshes/chrome_3.mesh" >
+ <ReferencedMaterial id="Brushed_Chrome_u1997" />
</Model>
- <Model id="black_3" name="black_3" importid="black_3" orientation="Right Handed" position="0 0 -0" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/dr/meshes/black_3.mesh" >
- <ReferencedMaterial id="Int_panel_plastic_matte_004" />
+ <Model id="black_u49272" variants="" name="black_3" importid="black_3" orientation="Right Handed" position="0 0 0" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/dr/meshes/black_3.mesh" >
+ <ReferencedMaterial id="Int_panel_plastic_matte_u39328" />
</Model>
</Group>
- <Group id="tires" >
- <Model id="rear_tires" name="rear_tires" importid="rear_tires" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/rear_tires.mesh" >
- <ReferencedMaterial id="rear_tires11_002" />
+ <Group id="tires_u39666" variants="" >
+ <Model id="rear_u52938" variants="" name="rear_tires" importid="rear_tires" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/rear_tires.mesh" >
+ <ReferencedMaterial id="rear_tires11_u41542" />
</Model>
- <Model id="front_tires" name="front_tires" importid="front_tires" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/front_tires.mesh" >
- <ReferencedMaterial id="rear_tires11_003" />
+ <Model id="front_u56393" variants="" name="front_tires" importid="front_tires" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/front_tires.mesh" >
+ <ReferencedMaterial id="rear_tires11_u21920" />
</Model>
</Group>
- <Group id="glasses" >
- <Model id="glass_4" name="glass_4" importid="glass_4" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/glass_4.mesh" >
- <ReferencedMaterial id="Simple_Glass_007" />
+ <Group id="glasses_u15508" variants="" >
+ <Model id="glass_u29153" variants="" name="glass_4" importid="glass_4" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/glass_4.mesh" >
+ <ReferencedMaterial id="Simple_Glass_u37290" />
</Model>
- <Model id="back_window" name="back_window" importid="back_window" orientation="Right Handed" position="182.659 235.819 12.7668" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/back_window.mesh" >
- <ReferencedMaterial id="Simple_Glass_008" />
+ <Model id="back_u23878" variants="" name="back_window" importid="back_window" orientation="Right Handed" position="182.659 235.819 12.7668" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/back_window.mesh" >
+ <ReferencedMaterial id="Simple_Glass_u46840" />
</Model>
- <Model id="front_lights_front_ights" name="front_lights_front_ights" importid="front_lights_front_ights" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/front_lights_front_ights.mesh" >
- <ReferencedMaterial id="Simple_Glass_009" />
+ <Model id="front_lights_front_u41018" variants="" name="front_lights_front_ights" importid="front_lights_front_ights" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/front_lights_front_ights.mesh" >
+ <ReferencedMaterial id="Simple_Glass_u50507" />
</Model>
</Group>
- <Group id="wheelDisks" >
- <Model id="front_wheel_chrome" name="front_wheel_chrome" importid="front_wheel_chrome" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/front_wheel_chrome.mesh" >
- <Material id="chrome" >
- <Image id="chrome_specularreflection" />
+ <Group id="wheelDisks_u62986" variants="" >
+ <Model id="front_wheel_u61778" variants="" name="front_wheel_chrome" importid="front_wheel_chrome" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/front_wheel_chrome.mesh" >
+ <Material id="chrome_u17083" >
+ <Image id="chrome_u62141" />
</Material>
</Model>
- <Model id="rear_wheel_chrome" name="rear_wheel_chrome" importid="rear_wheel_chrome" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/rear_wheel_chrome.mesh" >
- <ReferencedMaterial id="rear_wheel_chrome_Diffuse_Default" />
+ <Model id="rear_wheel_u41277" variants="" name="rear_wheel_chrome" importid="rear_wheel_chrome" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/rear_wheel_chrome.mesh" >
+ <ReferencedMaterial id="rear_wheel_chrome_Diffuse_u19067" />
</Model>
</Group>
- <Group id="mainShell" >
- <Model id="shell" name="shell" importid="shell" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/shell.mesh" >
- <ReferencedMaterial id="leicht_metalic_007" />
- </Model>
- <Model id="sun_roof" name="sun_roof" importid="sun_roof" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/sun_roof.mesh" >
- <ReferencedMaterial id="leicht_metalic_008" />
+ <Group id="mainShell_u61122" variants="" >
+ <Group id="shell inside_u59279" variants="" importid="__import__root__" >
+ <Model id="shell.inside_u2189" variants="" name="shell.inside" importid="shell.inside" orientation="Right Handed" position="0 0 0" rotation="2.50448e-06 0 0" rotationorder="XYZr" scale="99 99 99" sourcepath="../models/shell inside/meshes/shell.inside.mesh" >
+ <ReferencedMaterial id="shell.inside_Diffuse_u31146" importfile="../models/shell inside/shell inside.import" importid="shell.inside_Diffuse_Default" />
+ </Model>
+ </Group>
+ <Model id="shell_u43666" variants="" name="shell" importid="shell" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/shell.mesh" >
+ <ReferencedMaterial id="leicht_metalic_u7783" />
+ </Model>
+ <Model id="sun_u49927" variants="" name="sun_roof" importid="sun_roof" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/sun_roof.mesh" >
+ <ReferencedMaterial id="leicht_metalic_u24322" />
</Model>
</Group>
- <Model id="Cylinder" name="Cylinder" importid="Cylinder" orientation="Right Handed" position="-443.833 103.371 12.7547" rotation="-6.1912 -89.9914 -1.38078e-05" rotationorder="XYZr" scale="29.7288 23.8204 29.7288" sourcepath="../models/car/meshes/Cylinder.mesh" >
- <ReferencedMaterial id="Brushed_Chrome_008" />
+ <Model id="Cylinder_u44244" variants="" name="Cylinder" importid="Cylinder" orientation="Right Handed" position="-443.833 103.371 12.7547" rotation="-6.1912 -89.9914 -1.38078e-05" rotationorder="XYZr" scale="29.7288 23.8204 29.7288" sourcepath="../models/car/meshes/Cylinder.mesh" >
+ <ReferencedMaterial id="Brushed_Chrome_u5013" />
</Model>
- <Model id="Logo" name="Logo" importid="Logo" orientation="Right Handed" position="-652.742 99.9634 6.72341" rotation="-89.9794 -89.9914 2.52699e-18" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/Logo.mesh" >
- <ReferencedMaterial id="Brushed_Chrome_001" />
+ <Model id="Logo_u38812" variants="" name="Logo" importid="Logo" orientation="Right Handed" position="-652.742 99.9634 6.72341" rotation="-89.9794 -89.9914 2.52699e-18" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/Logo.mesh" >
+ <ReferencedMaterial id="Brushed_Chrome_u47792" />
</Model>
- <Model id="chrome_001" name="chrome" importid="chrome" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/chrome.mesh" >
- <ReferencedMaterial id="Brushed_Chrome_009" />
+ <Model id="chrome_u51974" variants="" name="chrome" importid="chrome" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/chrome.mesh" >
+ <ReferencedMaterial id="Brushed_Chrome_u61827" />
</Model>
- <Model id="matt_black" name="matt_black" importid="matt_black" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/matt_black.mesh" >
- <ReferencedMaterial id="Brushed_Chrome_0002" />
+ <Model id="matt_u56008" variants="" name="matt_black" importid="matt_black" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/matt_black.mesh" >
+ <ReferencedMaterial id="Brushed_Chrome_u25948" />
</Model>
- <Model id="taillights" name="taillights" importid="taillights" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/taillights.mesh" >
- <ReferencedMaterial id="Coloured_Glass11_001" />
+ <Model id="taillights_u29472" variants="" name="taillights" importid="taillights" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/taillights.mesh" >
+ <ReferencedMaterial id="Coloured_Glass11_u24559" />
</Model>
- <Model id="shadow" name="shadow" importid="shadow" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/shadow.mesh" >
- <Material id="Default_animatable" >
- <Image id="Default_animatable_diffusemap" />
+ <Model id="shadow_u39219" variants="" name="shadow" importid="shadow" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/shadow.mesh" >
+ <Material id="Default_u47268" >
+ <Image id="Default_animatable_u15592" />
</Material>
</Model>
- <Model id="seats" name="seats" importid="seats" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/seats.mesh" >
- <ReferencedMaterial id="seats_001" />
+ <Model id="seats_u10822" variants="" name="seats" importid="seats" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/seats.mesh" >
+ <ReferencedMaterial id="seats_u62338" />
</Model>
- <Model id="licence_plates" name="licence_plates" importid="licence_plates" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/licence_plates.mesh" >
- <ReferencedMaterial id="Int_panel_plastic_matte_111" />
+ <Model id="licence_u1988" variants="" name="licence_plates" importid="licence_plates" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/licence_plates.mesh" >
+ <ReferencedMaterial id="Int_panel_plastic_matte_u16772" />
</Model>
- <Model id="interior" name="interior" importid="interior" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/interior.mesh" >
- <ReferencedMaterial id="Rubber_-_Black_002" />
+ <Model id="interior_u33520" variants="" name="interior" importid="interior" orientation="Right Handed" position="-25.3146 5.96046e-06 12.8175" rotation="2.50646e-06 -89.9914 3.57796e-10" rotationorder="XYZr" scale="100 100 100" sourcepath="../models/car/meshes/interior.mesh" >
+ <ReferencedMaterial id="Rubber_-_Black_u8121" />
</Model>
</Group>
- <Model id="back" >
- <Material id="Material_001" >
- <Image id="Material_001_diffusemap" />
+ <Model id="back_u50661" variants="" >
+ <Material id="Material_u20537" >
+ <Image id="Material_001_u37457" />
</Material>
- <Light id="Light3" />
- <Light id="Light2" />
+ <Light id="Light3_u21852" />
+ <Light id="Light2_u48540" />
</Model>
- <Light id="Sun" name="Sun" brightness="100" castshadow="False" importid="Sun" lightdiffuse="1 1 1" lighttype="Directional" orientation="Right Handed" position="0 0 -0" rotation="0 -0 0" rotationorder="XYZr" scale="1 1 1" />
- <Camera id="Camera" />
+ <Light id="Sun_u4145" name="Sun" brightness="100" castshadow="False" importid="Sun" lightdiffuse="1 1 1 1" lighttype="Directional" orientation="Right Handed" position="0 0 0" rotation="0 0 0" rotationorder="XYZr" scale="1 1 1" />
+ <Camera id="Camera_u12795" />
</Layer>
- <Material id="__Container" >
- <Material id="materials/leicht_metalic_110" >
- <Image id="materials/leicht_metalic_110_specularreflection" />
+ <Material id="__u18257" >
+ <Material id="materials/leicht_metalic_u58269" >
+ <Image id="materials/leicht_metalic_110_u43245" />
</Material>
- <Material id="materials/Simple_Glass_111" name="Simple_Glass_1" blendmode="Normal" diffuse="0.00575411 0.00566999 0.00372564" emissivepower="0" importfile="../models/VA_v6/VA_v6.import" importid="Simple_Glass_1" opacity="60" specularamount="0" specularroughness="50" />
- <Material id="materials/rear_tires11" name="rear_tires" blendmode="Normal" diffuse="0 0 0" emissivepower="0" importfile="../models/VA_v6/VA_v6.import" importid="rear_tires_0001" opacity="100" specularamount="0" specularroughness="50" />
- <Material id="materials/Int_panel_plastic_matte_111" name="Int_panel_plastic_matte_1" blendmode="Normal" diffuse="0.64 0.64 0.64" emissivepower="0" importfile="../models/VA_v6/VA_v6.import" importid="Int_panel_plastic_matte_1" opacity="100" specularamount="0" specularroughness="50" />
- <Material id="materials/Rubber_-_Black_001" name="Rubber_-_Black_001" blendmode="Normal" diffuse="0.64 0.64 0.64" emissivepower="0" importfile="../models/VA_v6/VA_v6.import" importid="Rubber_-_Black_001" opacity="100" specularamount="0" specularroughness="50" />
- <Material id="materials/Brushed_Chrome_0002" />
- <Material id="materials/seats_111" />
- <Material id="materials/Coloured_Glass11" />
+ <Material id="materials/Simple_Glass_u60319" name="Simple_Glass_1" blendmode="Normal" diffuse="0.00575411 0.00566999 0.00372564 1" emissivepower="0" importfile="../models/VA_v6/VA_v6.import" importid="Simple_Glass_1" opacity="60" specularamount="0" specularroughness="50" />
+ <Material id="materials/rear_u51777" name="rear_tires" blendmode="Normal" diffuse="0 0 0 1" emissivepower="0" importfile="../models/VA_v6/VA_v6.import" importid="rear_tires_0001" opacity="100" specularamount="0" specularroughness="50" />
+ <Material id="materials/Int_panel_plastic_matte_u58285" name="Int_panel_plastic_matte_1" blendmode="Normal" diffuse="0.64 0.64 0.64 1" emissivepower="0" importfile="../models/VA_v6/VA_v6.import" importid="Int_panel_plastic_matte_1" opacity="100" specularamount="0" specularroughness="50" />
+ <Material id="materials/Rubber_-_Black_u5375" name="Rubber_-_Black_001" blendmode="Normal" diffuse="0.64 0.64 0.64 1" emissivepower="0" importfile="../models/VA_v6/VA_v6.import" importid="Rubber_-_Black_001" opacity="100" specularamount="0" specularroughness="50" />
+ <Material id="materials/Brushed_Chrome_u17628" />
+ <Material id="materials/seats_u15927" />
+ <Material id="materials/Coloured_u26086" />
+ <Material id="materials/shell.inside_Diffuse_u48485" />
</Material>
</Scene>
</Graph>
<Logic >
- <State name="Master Slide" component="#Scene" >
- <Add ref="#Layer" aodither="True" aosamplerate="2" aostrength="0" disabledepthprepass="True" disabledepthtest="False" multisampleaa="SSAA" probefov="180" probehorizon="-1" progressiveaa="4x" temporalaa="True" />
- <Add ref="#Camera" clipfar="35" clipnear="1" fov="10" fovhorizontal="False" orthographic="False" position="0 3 -35.318" rotation="9 0 0" scalemode="Same Size" />
- <Add ref="#__Container" name="__Container" />
- <Add ref="#materials/leicht_metalic_110" name="materials/leicht_metalic_110" controlledproperty="$diffuseColor diffuse" diffuse="0.670588 0.341176 1" diffuselightwrap="0" emissivecolor="1 1 1" emissivepower="0" importfile="../models/VA_v3/VA_v3.import" importid="leicht_metalic_1" ior="5" specularamount="0" specularmodel="Default" specularreflection="#materials/leicht_metalic_110_specularreflection" specularroughness="1" speculartint="0.662745 0.662745 0.662745" translucentfalloff="1" />
- <Add ref="#materials/leicht_metalic_110_specularreflection" importid="" mappingmode="Environmental Mapping" sourcepath="../maps/Specular-ceiling_lights-1.png" subpresentation="" />
- <Add ref="#materials/Simple_Glass_111" name="materials/Simple_Glass_111" opacity="75" />
- <Add ref="#materials/rear_tires11" name="materials/rear_tires11" />
- <Add ref="#materials/Int_panel_plastic_matte_111" name="materials/Int_panel_plastic_matte_111" />
- <Add ref="#materials/Rubber_-_Black_001" name="materials/Rubber_-_Black_001" />
- <Add ref="#materials/Brushed_Chrome_0002" name="materials/Brushed_Chrome_0002" diffuse="0.64 0.64 0.64" importfile="../models/VA_v6/VA_v6.import" importid="Brushed_Chrome_000" specularroughness="50" />
- <Add ref="#materials/seats_111" name="materials/seats_111" diffuse="0.64 0.64 0.64" importfile="../models/VA_v6/VA_v6.import" importid="seats_1" specularroughness="50" />
- <Add ref="#materials/Coloured_Glass11" name="materials/Coloured_Glass11" diffuse="0.64 0.0308856 0.0278321" importfile="../models/VA_v6/VA_v6.import" importid="Coloured_Glass" opacity="47.541" specularroughness="50" />
- <State id="Scene-Slide1" name="Slide1" playmode="PingPong" >
- <Add ref="#Sun2" name="Sun2" brightness="50" importfile="../models/VA_v6/VA_v6.import" lighttype="Point" position="0 957.001 5" />
- <Add ref="#car_001" name="car" controlledproperty="$vehicleRotation rotation" importfile="../models/car/car.import" position="0.1 -1.8 -10" rotation="0.985 270 -2.148" scale="0.01 0.01 0.01" sourcepath="../models/car/car.import" />
- <Add ref="#dleft" name="dleft" controlledproperty="$leftDoorRotation rotation" importfile="../models/dleft/dleft.import" position="-164.2 124.9 -154.1" scale="100 100 100" sourcepath="../models/dleft/dleft.import" />
- <Add ref="#silver_paint_1" importfile="../models/dleft/dleft.import" />
- <Add ref="#leicht_metalic_005" name="leicht_metalic_110" referencedmaterial="#materials/leicht_metalic_110" sourcepath="../materials/leicht_metalic_110.materialdef" />
- <Add ref="#glass" importfile="../models/dleft/dleft.import" />
- <Add ref="#Simple_Glass_005" name="Simple_Glass_111" referencedmaterial="#materials/Simple_Glass_111" sourcepath="../materials/Simple_Glass_111.materialdef" />
- <Add ref="#chrome_2" importfile="../models/dleft/dleft.import" />
- <Add ref="#Brushed_Chrome_006" name="Brushed_Chrome_0002" sourcepath="../materials/Brushed_Chrome_0002.materialdef" />
- <Add ref="#black_1" importfile="../models/dleft/dleft.import" />
- <Add ref="#Int_panel_plastic_matte_003" name="Int_panel_plastic_matte_111" referencedmaterial="#materials/Int_panel_plastic_matte_111" sourcepath="../materials/Int_panel_plastic_matte_111.materialdef" />
- <Add ref="#dr_001" name="dr" controlledproperty="$rightDoorRotation rotation" importfile="../models/dr/dr.import" position="-166.1 143.3 178.3" sourcepath="../models/dr/dr.import" />
- <Add ref="#silver_paint_2" importfile="../models/dr/dr.import" />
- <Add ref="#leicht_metalic_006" name="leicht_metalic_110" referencedmaterial="#materials/leicht_metalic_110" sourcepath="../materials/leicht_metalic_110.materialdef" />
- <Add ref="#glass_2" importfile="../models/dr/dr.import" />
- <Add ref="#Simple_Glass_006" name="Simple_Glass_111" referencedmaterial="#materials/Simple_Glass_111" sourcepath="../materials/Simple_Glass_111.materialdef" />
- <Add ref="#chrome_3" importfile="../models/dr/dr.import" />
- <Add ref="#Brushed_Chrome_007" name="Brushed_Chrome_0002" sourcepath="../materials/Brushed_Chrome_0002.materialdef" />
- <Add ref="#black_3" importfile="../models/dr/dr.import" />
- <Add ref="#Int_panel_plastic_matte_004" name="Int_panel_plastic_matte_111" referencedmaterial="#materials/Int_panel_plastic_matte_111" sourcepath="../materials/Int_panel_plastic_matte_111.materialdef" />
- <Add ref="#tires" name="tires" />
- <Add ref="#rear_tires" importfile="../models/car/car.import" />
- <Add ref="#rear_tires11_002" name="rear_tires11" referencedmaterial="#materials/rear_tires11" sourcepath="../materials/rear_tires11.materialdef" />
- <Add ref="#front_tires" importfile="../models/car/car.import" />
- <Add ref="#rear_tires11_003" name="rear_tires11" referencedmaterial="#materials/rear_tires11" sourcepath="../materials/rear_tires11.materialdef" />
- <Add ref="#glasses" name="glasses" />
- <Add ref="#glass_4" importfile="../models/car/car.import" />
- <Add ref="#Simple_Glass_007" name="Simple_Glass_111" referencedmaterial="#materials/Simple_Glass_111" sourcepath="../materials/Simple_Glass_111.materialdef" />
- <Add ref="#back_window" controlledproperty="$trunkRotation rotation" importfile="../models/car/car.import" rotation="35 -89.991 0" />
- <Add ref="#Simple_Glass_008" name="Simple_Glass_111" referencedmaterial="#materials/Simple_Glass_111" sourcepath="../materials/Simple_Glass_111.materialdef" />
- <Add ref="#front_lights_front_ights" importfile="../models/car/car.import" />
- <Add ref="#Simple_Glass_009" name="Simple_Glass_111" referencedmaterial="#materials/Simple_Glass_111" sourcepath="../materials/Simple_Glass_111.materialdef" />
- <Add ref="#wheelDisks" name="wheelDisks" />
- <Add ref="#front_wheel_chrome" importfile="../models/car/car.import" />
- <Add ref="#chrome" name="chrome" blendmode="Normal" bumpamount="0.5" diffuse="0 0 0" diffuselightwrap="0" displaceamount="20" emissivecolor="1 1 1" emissivepower="0" fresnelPower="0" importfile="../models/car/car.import" importid="front_wheel_chrome_Diffuse_Default" ior="1.5" opacity="100" shaderlighting="None" sourcepath="" specularamount="0" specularmodel="Default" specularreflection="#chrome_specularreflection" specularroughness="0" speculartint="1 1 1" translucentfalloff="1" type="Material" vertexcolors="False" />
- <Add ref="#chrome_specularreflection" mappingmode="Environmental Mapping" sourcepath="../maps/chromeMap.jpg" subpresentation="" />
- <Add ref="#rear_wheel_chrome" importfile="../models/car/car.import" />
- <Add ref="#rear_wheel_chrome_Diffuse_Default" name="rear_wheel_chrome_Diffuse_Default" referencedmaterial="#chrome" />
- <Add ref="#mainShell" name="mainShell" />
- <Add ref="#shell" importfile="../models/car/car.import" />
- <Add ref="#leicht_metalic_007" name="leicht_metalic_110" referencedmaterial="#materials/leicht_metalic_110" sourcepath="../materials/leicht_metalic_110.materialdef" />
- <Add ref="#sun_roof" controlledproperty="$sunRoofRotation rotation $sunRoofPosition position" importfile="../models/car/car.import" position="37 0 12.818" rotation="-6 -90 0" />
- <Add ref="#leicht_metalic_008" name="leicht_metalic_110" referencedmaterial="#materials/leicht_metalic_110" sourcepath="../materials/leicht_metalic_110.materialdef" />
- <Add ref="#Cylinder" importfile="../models/car/car.import" />
- <Add ref="#Brushed_Chrome_008" name="Brushed_Chrome_0002" referencedmaterial="#materials/Brushed_Chrome_0002" sourcepath="../materials/Brushed_Chrome_0002.materialdef" />
- <Add ref="#Logo" importfile="../models/car/car.import" />
- <Add ref="#Brushed_Chrome_001" name="Brushed_Chrome_0002" referencedmaterial="#chrome" />
- <Add ref="#chrome_001" importfile="../models/car/car.import" />
- <Add ref="#Brushed_Chrome_009" name="Brushed_Chrome_0002" referencedmaterial="#materials/Brushed_Chrome_0002" sourcepath="../materials/Brushed_Chrome_0002.materialdef" />
- <Add ref="#matt_black" importfile="../models/car/car.import" scale="100 100 100" />
- <Add ref="#Brushed_Chrome_0002" name="Brushed_Chrome_0002" referencedmaterial="#materials/Brushed_Chrome_0002" sourcepath="../materials/Brushed_Chrome_0002.materialdef" />
- <Add ref="#taillights" importfile="../models/car/car.import" />
- <Add ref="#Coloured_Glass11_001" name="Coloured_Glass11" referencedmaterial="#materials/Coloured_Glass11" sourcepath="../materials/Coloured_Glass11.materialdef" />
- <Add ref="#shadow" importfile="../models/car/car.import" />
- <Add ref="#Default_animatable" name="Default_animatable" blendmode="Normal" bumpamount="0.5" diffuse="1 1 1" diffuselightwrap="0" diffusemap="#Default_animatable_diffusemap" displaceamount="20" emissivecolor="1 1 1" emissivepower="0" fresnelPower="0" importfile="" importid="" ior="1.5" opacity="100" shaderlighting="Pixel" sourcepath="" specularamount="0" specularmodel="Default" specularroughness="0" speculartint="1 1 1" translucentfalloff="1" type="Material" vertexcolors="False" />
- <Add ref="#Default_animatable_diffusemap" sourcepath="../assets/shadow.png" subpresentation="" />
- <Add ref="#seats" importfile="../models/car/car.import" />
- <Add ref="#seats_001" name="seats_111" referencedmaterial="#materials/seats_111" sourcepath="../materials/seats_111.materialdef" />
- <Add ref="#licence_plates" importfile="../models/car/car.import" />
- <Add ref="#Int_panel_plastic_matte_111" name="Int_panel_plastic_matte_111" referencedmaterial="#materials/Int_panel_plastic_matte_111" sourcepath="../materials/Int_panel_plastic_matte_111.materialdef" />
- <Add ref="#interior" importfile="../models/car/car.import" />
- <Add ref="#Rubber_-_Black_002" name="Rubber_-_Black_001" referencedmaterial="#materials/Rubber_-_Black_001" sourcepath="../materials/Rubber_-_Black_001.materialdef" />
- <Add ref="#back" name="back" position="1.88961 -0.107365 27.0972" rotation="0 0 0" scale="0.5 0.53748 1" sourcepath="#Rectangle" />
- <Add ref="#Material_001" diffusemap="#Material_001_diffusemap" />
- <Add ref="#Material_001_diffusemap" sourcepath="../assets/back.png" subpresentation="" />
- <Add ref="#Light3" name="Light3" lighttype="Point" position="446.401 394.144 -277.394" scope="#back" />
- <Add ref="#Light2" name="Light2" lighttype="Point" position="-491.75 394.144 -493.488" scope="#back" />
- <Add ref="#Sun" brightness="80" importfile="../models/VehicleAppScene/VehicleAppScene.import" lighttype="Point" position="0 -50 -145" scale="0.1 0.1 0.1" />
+ <State name="Master Slide" component="#Scene_u47912" >
+ <Add ref="#Layer_u2391" aodither="False" aosamplerate="2" aostrength="0" blendtype="Normal" disabledepthprepass="False" disabledepthtest="False" multisampleaa="None" probefov="180" probehorizon="-1" progressiveaa="None" temporalaa="False" />
+ <Add ref="#Camera_u12795" clipfar="35" clipnear="1" fov="10" fovhorizontal="False" orthographic="False" position="0 3 -35.318" rotation="9 0 0" scalemode="Fit" />
+ <Add ref="#__u18257" name="__Container" />
+ <Add ref="#materials/leicht_metalic_u58269" name="materials/leicht_metalic_110" controlledproperty="$diffuseColor diffuse" diffuse="0.670588 0.341176 1 1" diffuselightwrap="0" emissivecolor="1 1 1 1" emissivepower="0" importfile="../models/VA_v3/VA_v3.import" importid="leicht_metalic_1" ior="5" specularamount="0" specularmodel="Default" specularreflection="#materials/leicht_metalic_110_u43245" specularroughness="1" speculartint="0.662745 0.662745 0.662745 1" translucentfalloff="1" />
+ <Add ref="#materials/leicht_metalic_110_u43245" importid="" mappingmode="Environmental Mapping" sourcepath="../maps/Specular-ceiling_lights-1.png" subpresentation="" />
+ <Add ref="#materials/Simple_Glass_u60319" name="materials/Simple_Glass_111" opacity="75" />
+ <Add ref="#materials/rear_u51777" name="materials/rear_tires11" />
+ <Add ref="#materials/Int_panel_plastic_matte_u58285" name="materials/Int_panel_plastic_matte_111" />
+ <Add ref="#materials/Rubber_-_Black_u5375" name="materials/Rubber_-_Black_001" />
+ <Add ref="#materials/Brushed_Chrome_u17628" name="materials/Brushed_Chrome_0002" diffuse="0.64 0.64 0.64 1" importfile="../models/VA_v6/VA_v6.import" importid="Brushed_Chrome_000" specularroughness="50" />
+ <Add ref="#materials/seats_u15927" name="materials/seats_111" diffuse="0.64 0.64 0.64 1" importfile="../models/VA_v6/VA_v6.import" importid="seats_1" specularroughness="50" />
+ <Add ref="#materials/Coloured_u26086" name="materials/Coloured_Glass11" diffuse="0.64 0.0308856 0.0278321 1" importfile="../models/VA_v6/VA_v6.import" importid="Coloured_Glass" opacity="47.541" specularroughness="50" />
+ <Add ref="#materials/shell.inside_Diffuse_u48485" name="materials/shell.inside_Diffuse_Default" diffuse="0.8 0.8 0.8 1" importfile="../models/shell inside/shell inside.import" importid="shell.inside_Diffuse_Default" />
+ <State id="Scene-Slide1_u62524" name="Slide1" playmode="PingPong" >
+ <Add ref="#Sun2_u45404" name="Sun2" brightness="50" importfile="../models/VA_v6/VA_v6.import" lighttype="Point" position="0 957.001 5" />
+ <Add ref="#car_u52433" name="car" controlledproperty="$vehicleRotation rotation" importfile="../models/car/car.import" position="0.1 -1.8 -10" rotation="0 270 -2.148" scale="0.01 0.01 0.01" sourcepath="../models/car/car.import" />
+ <Add ref="#dleft_u43675" name="dleft" controlledproperty="$leftDoorRotation rotation" importfile="../models/dleft/dleft.import" position="-164.2 124.9 -154.1" scale="100 100 100" sourcepath="../models/dleft/dleft.import" />
+ <Add ref="#silver_paint_u16963" importfile="../models/dleft/dleft.import" />
+ <Add ref="#leicht_metalic_u23326" name="leicht_metalic_110" referencedmaterial="#materials/leicht_metalic_u58269" sourcepath="../materials/leicht_metalic_110.materialdef" />
+ <Add ref="#glass_u25383" importfile="../models/dleft/dleft.import" />
+ <Add ref="#Simple_Glass_u35068" name="Simple_Glass_111" referencedmaterial="#materials/Simple_Glass_u60319" sourcepath="../materials/Simple_Glass_111.materialdef" />
+ <Add ref="#chrome_u60341" importfile="../models/dleft/dleft.import" />
+ <Add ref="#Brushed_Chrome_u34791" name="Brushed_Chrome_0002" sourcepath="../materials/Brushed_Chrome_0002.materialdef" />
+ <Add ref="#black_u41716" importfile="../models/dleft/dleft.import" />
+ <Add ref="#Int_panel_plastic_matte_u45799" name="Int_panel_plastic_matte_111" referencedmaterial="#materials/Int_panel_plastic_matte_u58285" sourcepath="../materials/Int_panel_plastic_matte_111.materialdef" />
+ <Add ref="#dr_u56297" name="dr" controlledproperty="$rightDoorRotation rotation" importfile="../models/dr/dr.import" position="-166.1 143.3 178.3" sourcepath="../models/dr/dr.import" />
+ <Add ref="#silver_paint_u10921" importfile="../models/dr/dr.import" />
+ <Add ref="#leicht_metalic_u11104" name="leicht_metalic_110" referencedmaterial="#materials/leicht_metalic_u58269" sourcepath="../materials/leicht_metalic_110.materialdef" />
+ <Add ref="#glass_u28544" importfile="../models/dr/dr.import" />
+ <Add ref="#Simple_Glass_u57408" name="Simple_Glass_111" referencedmaterial="#materials/Simple_Glass_u60319" sourcepath="../materials/Simple_Glass_111.materialdef" />
+ <Add ref="#chrome_u32682" importfile="../models/dr/dr.import" />
+ <Add ref="#Brushed_Chrome_u1997" name="Brushed_Chrome_0002" sourcepath="../materials/Brushed_Chrome_0002.materialdef" />
+ <Add ref="#black_u49272" importfile="../models/dr/dr.import" />
+ <Add ref="#Int_panel_plastic_matte_u39328" name="Int_panel_plastic_matte_111" referencedmaterial="#materials/Int_panel_plastic_matte_u58285" sourcepath="../materials/Int_panel_plastic_matte_111.materialdef" />
+ <Add ref="#tires_u39666" name="tires" />
+ <Add ref="#rear_u52938" importfile="../models/car/car.import" />
+ <Add ref="#rear_tires11_u41542" name="rear_tires11" referencedmaterial="#materials/rear_u51777" sourcepath="../materials/rear_tires11.materialdef" />
+ <Add ref="#front_u56393" importfile="../models/car/car.import" />
+ <Add ref="#rear_tires11_u21920" name="rear_tires11" referencedmaterial="#materials/rear_u51777" sourcepath="../materials/rear_tires11.materialdef" />
+ <Add ref="#glasses_u15508" name="glasses" />
+ <Add ref="#glass_u29153" importfile="../models/car/car.import" />
+ <Add ref="#Simple_Glass_u37290" name="Simple_Glass_111" referencedmaterial="#materials/Simple_Glass_u60319" sourcepath="../materials/Simple_Glass_111.materialdef" />
+ <Add ref="#back_u23878" controlledproperty="$trunkRotation rotation" importfile="../models/car/car.import" rotation="35 -89.991 0" />
+ <Add ref="#Simple_Glass_u46840" name="Simple_Glass_111" referencedmaterial="#materials/Simple_Glass_u60319" sourcepath="../materials/Simple_Glass_111.materialdef" />
+ <Add ref="#front_lights_front_u41018" importfile="../models/car/car.import" />
+ <Add ref="#Simple_Glass_u50507" name="Simple_Glass_111" referencedmaterial="#materials/Simple_Glass_u60319" sourcepath="../materials/Simple_Glass_111.materialdef" />
+ <Add ref="#wheelDisks_u62986" name="wheelDisks" position="0 0 -2" />
+ <Add ref="#front_wheel_u61778" importfile="../models/car/car.import" />
+ <Add ref="#chrome_u17083" name="chrome" blendmode="Normal" bumpamount="0.5" diffuse="0 0 0 1" diffuselightwrap="0" displaceamount="20" emissivecolor="1 1 1 1" emissivepower="0" fresnelPower="0" importfile="../models/car/car.import" importid="front_wheel_chrome_Diffuse_Default" ior="1.5" opacity="100" shaderlighting="None" sourcepath="" specularamount="0" specularmodel="Default" specularreflection="#chrome_u62141" specularroughness="0" speculartint="1 1 1 1" translucentfalloff="1" type="Material" vertexcolors="False" />
+ <Add ref="#chrome_u62141" mappingmode="Environmental Mapping" sourcepath="../maps/chromeMap.jpg" subpresentation="" />
+ <Add ref="#rear_wheel_u41277" importfile="../models/car/car.import" position="-25.315 0 14.818" />
+ <Add ref="#rear_wheel_chrome_Diffuse_u19067" name="rear_wheel_chrome_Diffuse_Default" referencedmaterial="#chrome_u17083" />
+ <Add ref="#mainShell_u61122" name="mainShell" rotation="0 0 0" />
+ <Add ref="#shell inside_u59279" name="shell inside" importfile="../models/shell inside/shell inside.import" position="-25.315 0 12.818" rotation="0 89.991 0" sourcepath="../models/shell inside/shell inside.import" />
+ <Add ref="#shell.inside_u2189" importfile="../models/shell inside/shell inside.import" />
+ <Add ref="#shell.inside_Diffuse_u31146" name="shell.inside_Diffuse_Default" referencedmaterial="#materials/shell.inside_Diffuse_u48485" sourcepath="../materials/shell.inside_Diffuse_Default.materialdef" />
+ <Add ref="#shell_u43666" importfile="../models/car/car.import" position="-25.315 0 12.818" rotation="0 -89.991 0" />
+ <Add ref="#leicht_metalic_u7783" name="leicht_metalic_110" referencedmaterial="#materials/leicht_metalic_u58269" sourcepath="../materials/leicht_metalic_110.materialdef" />
+ <Add ref="#sun_u49927" controlledproperty="$sunRoofRotation rotation $sunRoofPosition position" importfile="../models/car/car.import" position="37 0 12.818" rotation="-6 -90 0" />
+ <Add ref="#leicht_metalic_u24322" name="leicht_metalic_110" referencedmaterial="#materials/leicht_metalic_u58269" sourcepath="../materials/leicht_metalic_110.materialdef" />
+ <Add ref="#Cylinder_u44244" importfile="../models/car/car.import" />
+ <Add ref="#Brushed_Chrome_u5013" name="Brushed_Chrome_0002" referencedmaterial="#materials/Brushed_Chrome_u17628" sourcepath="../materials/Brushed_Chrome_0002.materialdef" />
+ <Add ref="#Logo_u38812" importfile="../models/car/car.import" locked="False" />
+ <Add ref="#Brushed_Chrome_u47792" name="Brushed_Chrome_0002" locked="False" referencedmaterial="#chrome_u17083" />
+ <Add ref="#chrome_u51974" importfile="../models/car/car.import" />
+ <Add ref="#Brushed_Chrome_u61827" name="Brushed_Chrome_0002" referencedmaterial="#materials/Brushed_Chrome_u17628" sourcepath="../materials/Brushed_Chrome_0002.materialdef" />
+ <Add ref="#matt_u56008" importfile="../models/car/car.import" scale="100 100 100" />
+ <Add ref="#Brushed_Chrome_u25948" name="Brushed_Chrome_0002" referencedmaterial="#materials/Brushed_Chrome_u17628" sourcepath="../materials/Brushed_Chrome_0002.materialdef" />
+ <Add ref="#taillights_u29472" importfile="../models/car/car.import" />
+ <Add ref="#Coloured_Glass11_u24559" name="Coloured_Glass11" referencedmaterial="#materials/Coloured_u26086" sourcepath="../materials/Coloured_Glass11.materialdef" />
+ <Add ref="#shadow_u39219" importfile="../models/car/car.import" />
+ <Add ref="#Default_u47268" name="Default_animatable" blendmode="Normal" bumpamount="0.5" diffuse="1 1 1 1" diffuselightwrap="0" diffusemap="#Default_animatable_u15592" displaceamount="20" emissivecolor="1 1 1 1" emissivepower="0" fresnelPower="0" importfile="" importid="" ior="1.5" opacity="100" shaderlighting="Pixel" sourcepath="" specularamount="0" specularmodel="Default" specularroughness="0" speculartint="1 1 1 1" translucentfalloff="1" type="Material" vertexcolors="False" />
+ <Add ref="#Default_animatable_u15592" sourcepath="../assets/shadow.png" subpresentation="" />
+ <Add ref="#seats_u10822" importfile="../models/car/car.import" />
+ <Add ref="#seats_u62338" name="seats_111" referencedmaterial="#materials/seats_u15927" sourcepath="../materials/seats_111.materialdef" />
+ <Add ref="#licence_u1988" importfile="../models/car/car.import" />
+ <Add ref="#Int_panel_plastic_matte_u16772" name="Int_panel_plastic_matte_111" referencedmaterial="#materials/Int_panel_plastic_matte_u58285" sourcepath="../materials/Int_panel_plastic_matte_111.materialdef" />
+ <Add ref="#interior_u33520" importfile="../models/car/car.import" />
+ <Add ref="#Rubber_-_Black_u8121" name="Rubber_-_Black_001" referencedmaterial="#materials/Rubber_-_Black_u5375" sourcepath="../materials/Rubber_-_Black_001.materialdef" />
+ <Add ref="#back_u50661" name="back" position="1.88961 -0.107365 27.0972" rotation="0 0 0" scale="0.5 0.53748 1" sourcepath="#Rectangle" />
+ <Add ref="#Material_u20537" diffusemap="#Material_001_u37457" />
+ <Add ref="#Material_001_u37457" sourcepath="../assets/back.png" subpresentation="" />
+ <Add ref="#Light3_u21852" name="Light3" lighttype="Point" position="446.401 394.144 -277.394" scope="#back_u50661" />
+ <Add ref="#Light2_u48540" name="Light2" lighttype="Point" position="-491.75 394.144 -493.488" scope="#back_u50661" />
+ <Add ref="#Sun_u4145" brightness="80" importfile="../models/VehicleAppScene/VehicleAppScene.import" lighttype="Point" position="0 -50 -145" scale="0.1 0.1 0.1" />
</State>
</State>
</Logic>
diff --git a/apps/com.luxoft.vehicle/assets/3dCar/vehicle3dStudio.uia b/apps/com.luxoft.vehicle/assets/3dCar/vehicle3dStudio.uia
index 2bdc0904..cf772539 100644
--- a/apps/com.luxoft.vehicle/assets/3dCar/vehicle3dStudio.uia
+++ b/apps/com.luxoft.vehicle/assets/3dCar/vehicle3dStudio.uia
@@ -1,14 +1,14 @@
<?xml version='1.0' encoding='utf-8'?>
<application xmlns="http://qt.io/qt3dstudio/uia">
<assets initial="vehicle3dStudio">
- <presentation src="presentations/vehicle3dStudio.uip" id="vehicle3dStudio"/>
- <dataInput type="Vector3" name="diffuseColor"/>
- <dataInput type="Vector3" name="leftDoorRotation"/>
- <dataInput type="Vector3" name="rightDoorRotation"/>
- <dataInput type="Vector3" name="sunRoofPosition"/>
- <dataInput type="Vector3" name="sunRoofRotation"/>
- <dataInput type="Vector3" name="trunkRotation"/>
- <dataInput type="Vector3" name="vehicleRotation"/>
+ <presentation id="vehicle3dStudio" src="presentations/vehicle3dStudio.uip"/>
+ <dataInput metadata="" name="diffuseColor" type="Vector4"/>
+ <dataInput metadata="" name="leftDoorRotation" type="Vector3"/>
+ <dataInput metadata="" name="rightDoorRotation" type="Vector3"/>
+ <dataInput metadata="" name="sunRoofPosition" type="Vector3"/>
+ <dataInput metadata="" name="sunRoofRotation" type="Vector3"/>
+ <dataInput metadata="" name="trunkRotation" type="Vector3"/>
+ <dataInput metadata="" name="vehicleRotation" type="Vector3"/>
</assets>
<statemachine ref="#logic">
<visual-states>
diff --git a/apps/com.luxoft.vehicle/helpers/Qt3DStudioAvailable.qml b/apps/com.luxoft.vehicle/helpers/Qt3DStudioAvailable.qml
index 39586aad..a4146edd 100644
--- a/apps/com.luxoft.vehicle/helpers/Qt3DStudioAvailable.qml
+++ b/apps/com.luxoft.vehicle/helpers/Qt3DStudioAvailable.qml
@@ -28,7 +28,8 @@
** SPDX-License-Identifier: GPL-3.0
**
****************************************************************************/
-import QtStudio3D 2.1
+
+import QtStudio3D.OpenGL 2.5
import QtQuick 2.8
Item {}
diff --git a/apps/com.luxoft.vehicle/helpers/pathsProvider.js b/apps/com.luxoft.vehicle/helpers/pathsProvider.js
index 36d7aa4c..4964dd16 100644
--- a/apps/com.luxoft.vehicle/helpers/pathsProvider.js
+++ b/apps/com.luxoft.vehicle/helpers/pathsProvider.js
@@ -31,14 +31,7 @@
****************************************************************************/
.pragma library
-
-function doesFileExist(url) {
- var req = new XMLHttpRequest();
- req.open('HEAD', url, false);
- req.send();
- return req.status == 200;
-}
-
+.import shared.FileUtils 1.0 as FU
// see vehicle app info.yaml for description
function getModelPath(name, version) {
@@ -51,7 +44,7 @@ function getModelPath(name, version) {
if (version === "mixedFormats") {
var pathObj = Qt.resolvedUrl("../assets/models/" + version + "/" + name + ".obj")
var pathStl = Qt.resolvedUrl("../assets/models/" + version + "/" + name + ".stl")
- return doesFileExist(pathObj) ? pathObj : pathStl
+ return FU.FileUtils.existsFileFromUrl(pathObj) ? pathObj : pathStl
}
}
diff --git a/apps/com.luxoft.vehicle/info.yaml b/apps/com.luxoft.vehicle/info.yaml
index 6245b089..24aafb80 100644
--- a/apps/com.luxoft.vehicle/info.yaml
+++ b/apps/com.luxoft.vehicle/info.yaml
@@ -1,10 +1,8 @@
formatVersion: 1
-formatType: am-application
+formatType: am-package
---
id: 'com.luxoft.vehicle'
icon: 'icon.png'
-code: 'Main.qml'
-runtime: 'qml'
name:
en: 'Vehicle'
ru: 'Auto'
@@ -14,10 +12,27 @@ name:
ja: '車両'
ko: '차량'
-applicationProperties:
- private:
+applications:
+ - id: 'com.luxoft.vehicle'
+ code: 'Main.qml'
+ runtime: 'qml'
+ applicationProperties:
+ protected:
+ runBefore: ['com.luxoft.vehicle-ic']
+ runAfter: []
+ private:
squishPort: 7732
+ - id: 'com.luxoft.vehicle-ic'
+ code: 'MainIC.qml'
+ runtime: 'qml'
+ applicationProperties:
+ protected:
+ showInLauncher: no
categories: [ 'navigation', 'vehicle' ]
+
intents:
+- id: activate-app
+ handlingApplicationId: 'com.luxoft.vehicle'
- id: vehicle-control
+ handlingApplicationId: 'com.luxoft.vehicle'
diff --git a/apps/com.luxoft.vehicle/panels/DoorsPanel.qml b/apps/com.luxoft.vehicle/panels/DoorsPanel.qml
index 66e9a7e3..8b870dd1 100644
--- a/apps/com.luxoft.vehicle/panels/DoorsPanel.qml
+++ b/apps/com.luxoft.vehicle/panels/DoorsPanel.qml
@@ -47,9 +47,12 @@ Item {
property alias trunkOpened: trunkPanel.trunkOpened
property alias roofOpenProgress: roofPanel.roofOpenProgress
+ property bool enableOpacityMasks: true
+
signal leftDoorClicked()
signal rightDoorClicked()
signal trunkClicked()
+ signal newRoofOpenProgressRequested(var progress)
TabBar {
id: tabBar
@@ -84,14 +87,19 @@ Item {
id: roofPanel
objectName: "subView_roof"
+ enableOpacityMasks: root.enableOpacityMasks
leftDoorOpened: root.leftDoorOpened
rightDoorOpened: root.rightDoorOpened
trunkOpened: root.trunkOpened
+
+ onNewRoofOpenProgressRequested: root.newRoofOpenProgressRequested(progress)
}
FrontDoorsPanel {
id: frontDoorsPanel
objectName: "subView_doors"
+
+ enableOpacityMasks: root.enableOpacityMasks
onLeftDoorClicked: root.leftDoorClicked()
onRightDoorClicked: root.rightDoorClicked()
@@ -104,6 +112,7 @@ Item {
objectName: "subView_trunk"
onTrunkClicked: root.trunkClicked()
+ enableOpacityMasks: root.enableOpacityMasks
leftDoorOpened: root.leftDoorOpened
rightDoorOpened: root.rightDoorOpened
roofOpenProgress: root.roofOpenProgress
diff --git a/apps/com.luxoft.vehicle/panels/EnergyPanel.qml b/apps/com.luxoft.vehicle/panels/EnergyPanel.qml
index 56c95923..53bbe0e0 100644
--- a/apps/com.luxoft.vehicle/panels/EnergyPanel.qml
+++ b/apps/com.luxoft.vehicle/panels/EnergyPanel.qml
@@ -43,6 +43,9 @@ import "../helpers" 1.0
import "../controls" 1.0
Item {
+ id: root
+ signal intentToMapRequested(var intentId, var params)
+
TabBar {
id: energyControls
anchors.top: parent.top
@@ -133,7 +136,8 @@ Item {
anchors.right: parent.right
anchors.rightMargin: Sizes.dp(22)
state: "SMALL"
- text: qsTr("Show on map")
+ text: qsTr("Open map")
+ onClicked: root.intentToMapRequested("activate-app", {});
}
Image {
@@ -192,8 +196,8 @@ Item {
state: "SMALL"
text: qsTr("Route")
onClicked: {
- var pathToRoute = "x-map://getMeTo/" + firstStationAddressLabel.text;
- Qt.openUrlExternally(pathToRoute);
+ root.intentToMapRequested("show-destination",
+ {"destination": firstStationAddressLabel.text});
}
}
}
@@ -247,8 +251,8 @@ Item {
state: "SMALL"
text: qsTr("Route")
onClicked: {
- var pathToRoute = "x-map://getMeTo/" + secondStationAddressLabel.text;
- Qt.openUrlExternally(pathToRoute);
+ root.intentToMapRequested("show-destination",
+ {"destination": secondStationAddressLabel.text});
}
}
}
diff --git a/apps/com.luxoft.vehicle/panels/FrontDoorsPanel.qml b/apps/com.luxoft.vehicle/panels/FrontDoorsPanel.qml
index 86aa91a9..eb67fd94 100644
--- a/apps/com.luxoft.vehicle/panels/FrontDoorsPanel.qml
+++ b/apps/com.luxoft.vehicle/panels/FrontDoorsPanel.qml
@@ -50,6 +50,7 @@ Item {
property bool rightDoorOpened: false
property bool trunkOpened: false
property real roofOpenProgress: 0.0
+ property bool enableOpacityMasks
signal leftDoorClicked()
signal rightDoorClicked()
@@ -100,7 +101,7 @@ Item {
TopPanel {
id: vehicleTopView
anchors.horizontalCenter: parent.horizontalCenter
- visible: false
+ visible: !root.enableOpacityMasks
leftDoorOpen: root.leftDoorOpened
rightDoorOpen: root.rightDoorOpened
diff --git a/apps/com.luxoft.vehicle/panels/RoofPanel.qml b/apps/com.luxoft.vehicle/panels/RoofPanel.qml
index 6807d765..0c3918a3 100644
--- a/apps/com.luxoft.vehicle/panels/RoofPanel.qml
+++ b/apps/com.luxoft.vehicle/panels/RoofPanel.qml
@@ -45,10 +45,13 @@ import "../controls" 1.0
Item {
id: root
- property alias roofOpenProgress: vehicleTopView.roofOpenProgress
+ property real roofOpenProgress: 0.0
property bool leftDoorOpened: false
property bool rightDoorOpened: false
property bool trunkOpened: false
+ property bool enableOpacityMasks
+
+ signal newRoofOpenProgressRequested(var progress)
Behavior on roofOpenProgress { DefaultNumberAnimation { duration: 800 } }
@@ -66,7 +69,15 @@ Item {
TopPanel {
id: vehicleTopView
- visible: false
+ visible: !root.enableOpacityMasks
+
+ rotation: root.enableOpacityMasks ? 0 : 90
+ transform: [
+ Translate {
+ x: root.enableOpacityMasks ? 0 : -width/10
+ y: root.enableOpacityMasks ? 0 : -height/20
+ }
+ ]
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
@@ -74,6 +85,7 @@ Item {
leftDoorOpen: root.leftDoorOpened
rightDoorOpen: root.rightDoorOpened
trunkOpen: root.trunkOpened
+ roofOpenProgress: root.roofOpenProgress
}
OpacityMask {
@@ -87,26 +99,15 @@ Item {
}
VehicleButton {
- id: roofOpenButton
- objectName: "roofOpenButton"
+ id: roofButton
+ objectName: "roofButton"
- anchors.top: om.verticalCenter
- anchors.topMargin: -height
- anchors.right: parent.right
- state: "REGULAR"
- text: qsTr("Close")
- onClicked: root.roofOpenProgress = 0.0
- }
-
- VehicleButton {
- id: roofCloseButton
- objectName: "roofCloseButton"
-
- anchors.top: om.verticalCenter
- anchors.topMargin: -height
- anchors.left: parent.left
+ anchors.bottom: om.bottom
+ anchors.bottomMargin: Sizes.dp(135)
+ anchors.horizontalCenter: parent.horizontalCenter
state: "REGULAR"
- text: qsTr("Open")
- onClicked: root.roofOpenProgress = 1.0
+ text: root.roofOpenProgress > 0.0 ? qsTr("Close") : qsTr("Open")
+ onClicked: root.roofOpenProgress < 1.0 ? root.newRoofOpenProgressRequested(1.0) :
+ root.newRoofOpenProgressRequested(0.0)
}
}
diff --git a/apps/com.luxoft.vehicle/panels/TrunkPanel.qml b/apps/com.luxoft.vehicle/panels/TrunkPanel.qml
index 636b583d..b2460d12 100644
--- a/apps/com.luxoft.vehicle/panels/TrunkPanel.qml
+++ b/apps/com.luxoft.vehicle/panels/TrunkPanel.qml
@@ -46,39 +46,46 @@ Item {
property bool leftDoorOpened: false
property bool rightDoorOpened: false
property real roofOpenProgress: 0.0
+ property bool enableOpacityMasks
signal trunkClicked()
- Rectangle {
- id: carImageMask
+ Item {
+ anchors.fill: parent
+ clip: true
+ visible: true
+
+ Rectangle {
+ id: carImageMask
+
+ anchors.fill: vehicleTopView
+ gradient: Gradient {
+ GradientStop { position: 0.22; color: "#00000000" }
+ GradientStop { position: 0.44; color: "#ff000000" }
+ GradientStop { position: 1.0; color: "#ff000000" }
+ }
+ visible: false
+ }
- anchors.fill: vehicleTopView
- gradient: Gradient {
- GradientStop { position: 0.22; color: "#00000000" }
- GradientStop { position: 0.44; color: "#ff000000" }
- GradientStop { position: 1.0; color: "#ff000000" }
+ OpacityMask {
+ anchors.fill: vehicleTopView
+ maskSource: carImageMask
+ source: vehicleTopView
}
- visible: false
- }
- OpacityMask {
- anchors.fill: vehicleTopView
- maskSource: carImageMask
- source: vehicleTopView
- }
+ TopPanel {
+ id: vehicleTopView
- TopPanel {
- id: vehicleTopView
+ anchors.top: parent.top
+ anchors.topMargin: Sizes.dp(-160)
+ anchors.horizontalCenter: parent.horizontalCenter
+ visible: !root.enableOpacityMasks
- anchors.top: parent.top
- anchors.topMargin: Sizes.dp(-160)
- anchors.horizontalCenter: parent.horizontalCenter
- visible: false
-
- trunkOpen: root.trunkOpened
- leftDoorOpen: root.leftDoorOpened
- rightDoorOpen: root.rightDoorOpened
- roofOpenProgress: root.roofOpenProgress
+ trunkOpen: root.trunkOpened
+ leftDoorOpen: root.leftDoorOpened
+ rightDoorOpen: root.rightDoorOpened
+ roofOpenProgress: root.roofOpenProgress
+ }
}
VehicleButton {
diff --git a/apps/com.luxoft.vehicle/panels/Vehicle3DControlPanel.qml b/apps/com.luxoft.vehicle/panels/Vehicle3DControlPanel.qml
index 6b9f0b25..a8b84056 100644
--- a/apps/com.luxoft.vehicle/panels/Vehicle3DControlPanel.qml
+++ b/apps/com.luxoft.vehicle/panels/Vehicle3DControlPanel.qml
@@ -46,18 +46,21 @@ Item {
property alias leftDoorOpened: doorsPanel.leftDoorOpened
property alias rightDoorOpened: doorsPanel.rightDoorOpened
property alias trunkOpened: doorsPanel.trunkOpened
+ property alias roofOpenProgress: doorsPanel.roofOpenProgress
property alias menuModel: toolsColumn.model
property alias controlModel: supportPanel.model
property alias qt3DStudioAvailable: vehicle3DSettingsPanel.qt3DStudioAvailable
property alias qualityModel: vehicle3DSettingsPanel.qualityModel
property alias quality: vehicle3DSettingsPanel.quality
property alias runtime: vehicle3DSettingsPanel.runtime
+ property alias enableOpacityMasks: doorsPanel.enableOpacityMasks
signal leftDoorClicked()
signal rightDoorClicked()
signal trunkClicked()
- signal roofOpenProgressChanged(var value)
+ signal newRoofOpenProgressRequested(var progress)
signal showNotificationAboutChange()
+ signal intentToMapRequested(var intentId, var params)
ToolsColumn {
id: toolsColumn
@@ -65,7 +68,6 @@ Item {
anchors.top: parent.top
anchors.left: parent.left
width: Sizes.dp(264)
- height: Sizes.dp(460)
translationContext: "VehicleToolsColumn"
}
@@ -80,14 +82,17 @@ Item {
currentIndex: toolsColumn.currentIndex
SupportPanel { id: supportPanel; objectName: "vehicleSupportPanel" }
- EnergyPanel { objectName: "vehicleEnergyPanel"}
+ EnergyPanel {
+ objectName: "vehicleEnergyPanel"
+ onIntentToMapRequested: root.intentToMapRequested(intentId, params)
+ }
DoorsPanel {
id: doorsPanel
objectName: "vehicleDoorsPanel"
onLeftDoorClicked: root.leftDoorClicked()
onRightDoorClicked: root.rightDoorClicked()
onTrunkClicked: root.trunkClicked()
- onRoofOpenProgressChanged: root.roofOpenProgressChanged(roofOpenProgress)
+ onNewRoofOpenProgressRequested: root.newRoofOpenProgressRequested(progress)
}
TiresPanel { objectName: "vehicleTiresPanel" }
Settings3DPanel {
diff --git a/apps/com.luxoft.vehicle/panels/Vehicle3DPanel.qml b/apps/com.luxoft.vehicle/panels/Vehicle3DPanel.qml
index da1b1db5..1c0068ff 100644
--- a/apps/com.luxoft.vehicle/panels/Vehicle3DPanel.qml
+++ b/apps/com.luxoft.vehicle/panels/Vehicle3DPanel.qml
@@ -30,14 +30,14 @@
**
****************************************************************************/
-import QtQuick 2.0
-import Qt3D.Core 2.0
-import Qt3D.Render 2.9
-import Qt3D.Extras 2.9
-import Qt3D.Input 2.0
-import Qt3D.Logic 2.0
-import QtQuick.Scene3D 2.0
-import QtQuick.Controls 2.3
+import QtQuick 2.14
+import Qt3D.Core 2.14
+import Qt3D.Render 2.14
+import Qt3D.Extras 2.14
+import Qt3D.Input 2.14
+import Qt3D.Logic 2.14
+import QtQuick.Scene3D 2.14
+import QtQuick.Controls 2.14
import shared.Sizes 1.0
@@ -54,16 +54,70 @@ Item {
property string modelVersion
//ToDo: This is a part of a work around for the Scene3D windows&macOS bug
- property real roofOpenProgress: 0.0
+ property alias roofOpenProgress: roof.openProgress
property bool leftDoorOpen: false
property bool rightDoorOpen: false
property bool trunkOpen: false
property bool readyToChanges: false
- // in some cases Scene3D doesn't create anything, such cases are really hard to reproduce
- // but we need to have some flag to verify
- property bool renderStarted: false
+ QtObject {
+ id: d
+ readonly property vector2d base2d : Qt.vector2d(0.0, -15.0)
+ property real pixelAndTimeMagicCoeff: 0.5
+ property var trajectory: []
+ property var trajectoryV: []
+ }
+
+ function getCurrentAngle() {
+ var cameraPos = camera.position;
+ var vec2d = Qt.vector2d(-cameraPos.x, cameraPos.z);
+ var angle = 0.0;
+ angle = -Math.atan2(vec2d.x, vec2d.y);
+ angle = angle < 0 ? angle + 2*Math.PI : angle;
+ return angle * 180 / Math.PI;
+ }
+
+ function forceRedraw() {
+ // force scene to redraw (workaround for AUTOSUITE-1598)
+ // see FrameAction below: we force render policy to be 'Always' for at least 5 seconds
+ // this time should be enough to make model shown
+ // after this we set renderPolicy back to OnDemand to reduce cpu consuming
+ renderSettings.renderPolicy = RenderSettings.Always;
+ }
+
+ MouseArea {
+ anchors.top: parent.top
+ anchors.left: parent.left
+ anchors.right: parent.right
+ height: Sizes.dp(652)
+ z: 40
+
+ onReleased: {
+ d.trajectory = []
+ }
+
+ onPositionChanged: {
+ if (pressed) {
+ d.trajectory.push(mouseX);
+ d.trajectoryV.push(mouseY);
+ if (d.trajectory.length > 2) {
+ var dx = 0
+ for (var i = 1; i < d.trajectory.length; ++i) {
+ dx += d.trajectory[i] - d.trajectory[i - 1];
+ }
+
+ if (dx !== 0) {
+ camera.panAboutViewCenter(-dx * d.pixelAndTimeMagicCoeff
+ , Qt.vector3d(0, 1, 0));
+ root.lastCameraAngle = getCurrentAngle();
+ }
+
+ d.trajectory = []
+ }
+ }
+ }
+ }
Scene3D {
@@ -91,27 +145,29 @@ Item {
FrameAction {
id: frameCounter
+ property real dtime: 0.0
+ onTriggered: {
+ if (renderSettings.renderPolicy === RenderSettings.Always) {
+ dtime += dt;
+ if (dtime > 5.0) {
+ dtime = 0;
+ renderSettings.renderPolicy = RenderSettings.OnDemand;
+ }
+ }
+ }
}
components: [inputSettings, renderSettings, frameCounter]
-
Connections {
id: readyToChangeConnection
target: frameCounter
+ enabled: !root.readyToChanges
property int fc: 0
- onTriggered: {
- if (!root.renderStarted) {
- root.renderStarted = true;
- }
-
- if (body.bodyLoaded) {
- fc += 1;
- // skip first 5 frames to be sure that all content is ready
- if (fc > 5) {
- readyToChangeConnection.target = null;
- root.readyToChanges = true;
- }
+ function onTriggered() {
+ if (++fc == 3) {
+ root.readyToChanges = true;
+ root.forceRedraw();
}
}
}
@@ -127,12 +183,6 @@ Item {
upVector: Qt.vector3d(0.0, 1.0, 0.0)
}
- CameraController {
- camera: camera
- enabled: true
- onCameraPanAngleChanged: root.lastCameraAngle = cameraPanAngle
- }
-
CookTorranceMaterial {
id: rubberMaterial
albedo: "black"
@@ -225,7 +275,6 @@ Item {
}
Roof {
id: roof
- openProgress: root.roofOpenProgress
version: root.modelVersion
}
Body {
@@ -233,7 +282,10 @@ Item {
version: root.modelVersion
onBodyLoadedChanged: {
if (bodyLoaded) {
- camera.panAboutViewCenter(lastCameraAngle, Qt.vector3d(0, 1, 0));
+ var angle = getCurrentAngle()
+ if (angle !== lastCameraAngle) {
+ camera.panAboutViewCenter(angle - lastCameraAngle, Qt.vector3d(0, 1, 0));
+ }
}
}
}
diff --git a/apps/com.luxoft.vehicle/panels/Vehicle3DStudioPanel.qml b/apps/com.luxoft.vehicle/panels/Vehicle3DStudioPanel.qml
index c05a6a3e..32a0704b 100644
--- a/apps/com.luxoft.vehicle/panels/Vehicle3DStudioPanel.qml
+++ b/apps/com.luxoft.vehicle/panels/Vehicle3DStudioPanel.qml
@@ -31,7 +31,7 @@
import QtQuick 2.12
import QtQuick.Controls 2.3
-import QtStudio3D 2.1
+import QtStudio3D.OpenGL 2.5
import shared.utils 1.0
import shared.Style 1.0
@@ -59,7 +59,6 @@ Item {
property var trajectoryV: []
}
-
onLeftDoorOpenChanged: {
if (leftDoorOpen) {
presentation.leftDoorAngle = 60;
@@ -106,7 +105,7 @@ Item {
dx += d.trajectory[i] - d.trajectory[i - 1];
}
- if (dx != 0) {
+ if (dx !== 0) {
presentation.angleHorizontal -= dx * coef;
root.lastCameraAngle = presentation.angleHorizontal - 270;
}
@@ -121,7 +120,7 @@ Item {
id: readyToChangeConnection
target: studio3D
property int fc: 0
- onFrameUpdate: {
+ function onFrameUpdate() {
fc += 1;
// skip first 10 frames to be sure that all content is ready
if (fc > 10) {
@@ -142,6 +141,12 @@ Item {
height: Sizes.dp(380)
width: Sizes.dp(960)
+ ViewerSettings {
+ scaleMode: ViewerSettings.ScaleModeFit
+// uncomment to display render statistics from ogl-runtime
+// showRenderStats: true
+ }
+
Presentation {
id: presentation
source: Paths.localQt3DStudioPresentationAsset("vehicle3dStudio.uia")
@@ -216,7 +221,10 @@ Item {
DataInput {
name: "diffuseColor"
- value: Qt.vector3d(root.vehicleColor.r, root.vehicleColor.g, root.vehicleColor.b)
+ value: Qt.vector4d(root.vehicleColor.r
+ , root.vehicleColor.g
+ , root.vehicleColor.b
+ , root.vehicleColor.a)
}
}
}
diff --git a/apps/com.luxoft.vehicle/panels/VehicleProxyPanel.qml b/apps/com.luxoft.vehicle/panels/VehicleProxyPanel.qml
index c2bf5685..6a2b02e4 100644
--- a/apps/com.luxoft.vehicle/panels/VehicleProxyPanel.qml
+++ b/apps/com.luxoft.vehicle/panels/VehicleProxyPanel.qml
@@ -42,6 +42,8 @@ Item {
id: root
anchors.fill: parent
+ property string errorText: ""
+
Image {
id: proxyImage
anchors.fill: parent
@@ -50,6 +52,15 @@ Item {
: Paths.getImagePath("carPlaceholderCC-light.png")
}
+ Label {
+ anchors.top: proxyImage.top
+ anchors.topMargin: Sizes.dp(160)
+ anchors.horizontalCenter: proxyImage.horizontalCenter
+ text: errorText
+ font.pixelSize: Sizes.fontSizeL
+ visible: errorText.length !== 0
+ }
+
ProgressBar {
anchors.bottom: parent.bottom
implicitWidth: parent.width
diff --git a/apps/com.luxoft.vehicle/stores/VehicleStore.qml b/apps/com.luxoft.vehicle/stores/VehicleStore.qml
index 4320543c..f1b3419f 100644
--- a/apps/com.luxoft.vehicle/stores/VehicleStore.qml
+++ b/apps/com.luxoft.vehicle/stores/VehicleStore.qml
@@ -33,7 +33,9 @@
import QtQuick 2.8
import shared.com.pelagicore.remotesettings 1.0
import shared.com.pelagicore.drivedata 1.0
+import shared.com.pelagicore.systeminfo 1.0
import QtApplicationManager.Application 2.0
+import QtApplicationManager 2.0
import Qt.labs.settings 1.0
QtObject {
@@ -49,16 +51,20 @@ QtObject {
property bool qt3DStudioAvailable: false
property color vehicle3DstudioColor
- // here we use loader to prevent build failures in case when Qt3DStudio is not available in the libs
+ readonly property SystemInfo systemInfo: SystemInfo {}
+ // here we use loader to prevent build failures in case
+ // when Qt3DStudio is not available in the libs
property Loader qt3DStudioAvailableChecker: Loader {
visible: false
source: "../helpers/Qt3DStudioAvailable.qml"
onLoaded: {
- root.qt3DStudioAvailable = true
+ root.qt3DStudioAvailable = systemInfo.allow3dStudioPresentations
source = ""
}
}
+ readonly property bool allowOpenGLContent: systemInfo.allowOpenGLContent
+
property Settings settings3D : Settings {}
function setRuntime(runtime) {
settings3D.setValue("runtime3D", runtime);
@@ -133,59 +139,63 @@ QtObject {
property InstrumentCluster cluster: InstrumentCluster { id: cluster }
readonly property IntentHandler intentHandler: IntentHandler {
- intentIds: "vehicle-control"
+ intentIds: ["vehicle-control", "activate-app"]
onRequestReceived: {
- var action = request.parameters["action"];
- var side = request.parameters["side"];
- var part = request.parameters["part"];
-
- switch (part) {
- case "trunk":
- if (action === "open") {
- root.trunkOpened = true;
- uiSettings.trunkOpen = true;
- }
- if (action === "close") {
- root.trunkOpened = false;
- uiSettings.trunkOpen = false;
- }
- break; //trunk
- case "sunroof":
- if (action === "open") {
- root.roofOpenProgress = 1.0;
- uiSettings.roofOpenProgress = 1.0;
- }
- if (action === "close") {
- root.roofOpenProgress = 0.0;
- uiSettings.roofOpenProgress = 0.0;
- }
- break; //sunroof
- case "door":
- if (side === "left") {
+ switch (request.intentId) {
+ case "vehicle-control":
+ var action = request.parameters["action"];
+ var side = request.parameters["side"];
+ var part = request.parameters["part"];
+
+ switch (part) {
+ case "trunk":
if (action === "open") {
- root.leftDoorOpened = true;
- uiSettings.door1Open = true;
- }
- if (action === "close") {
- root.leftDoorOpened = false;
- uiSettings.door1Open = false;
+ uiSettings.trunkOpen = true;
+ } else if (action === "close") {
+ uiSettings.trunkOpen = false;
}
- }
- if (side === "right") {
+ break; //trunk
+ case "sunroof":
if (action === "open") {
- root.rightDoorOpened = true;
- uiSettings.door2Open = true;
+ uiSettings.roofOpenProgress = 1.0;
+ } else if (action === "close") {
+ uiSettings.roofOpenProgress = 0.0;
}
- if (action === "close") {
- root.rightDoorOpened = false;
- uiSettings.door2Open = false;
+ break; //sunroof
+ case "door":
+ if (side === "left") {
+ if (action === "open") {
+ uiSettings.door1Open = true;
+ } else if (action === "close") {
+ uiSettings.door1Open = false;
+ }
+ } else if (side === "right") {
+ if (action === "open") {
+ uiSettings.door2Open = true;
+ } else if (action === "close") {
+ uiSettings.door2Open = false;
+ }
}
- }
- break; //door
- }//switch
+ break; //door
+ default:
+ break;
+ } //switch part
+
+ root.requestRaiseAppReceived();
+ request.sendReply({ "done": true })
+ break;
+ case "activate-app":
+ root.requestRaiseAppReceived();
+ request.sendReply({ "done": true })
+ break;
+ default:
+ break;
+ } //switch intent id
}
}
+ signal requestRaiseAppReceived()
+
function setTrunk() {
if (root.trunkOpened) {
root.trunkOpened = false;
@@ -220,4 +230,8 @@ QtObject {
root.roofOpenProgress = value;
uiSettings.roofOpenProgress = value;
}
+
+ function createIntentToMap(intentId, params) {
+ IntentClient.sendIntentRequest(intentId, "com.pelagicore.map", params);
+ }
}
diff --git a/apps/com.luxoft.vehicle/stores/VehicleStoreIC.qml b/apps/com.luxoft.vehicle/stores/VehicleStoreIC.qml
new file mode 100644
index 00000000..b02850a2
--- /dev/null
+++ b/apps/com.luxoft.vehicle/stores/VehicleStoreIC.qml
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Copyright (C) 2018 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.8
+import shared.com.pelagicore.remotesettings 1.0
+import shared.com.pelagicore.drivedata 1.0
+
+
+QtObject {
+ id: root
+
+ property bool leftDoorOpened: false
+ property bool rightDoorOpened: false
+ property bool trunkOpened: false
+ property real roofOpenProgress: 0.0
+ property real speed: clusterSettings.speed
+
+ readonly property UISettings uiSettings: UISettings {
+ onDoor1OpenChanged: {
+ root.leftDoorOpened = uiSettings.door1Open
+ }
+ onDoor2OpenChanged: {
+ root.rightDoorOpened = uiSettings.door2Open
+ }
+ onTrunkOpenChanged: {
+ root.trunkOpened = uiSettings.trunkOpen
+ }
+ onRoofOpenProgressChanged: {
+ root.roofOpenProgress = uiSettings.roofOpenProgress
+ }
+ }
+
+ readonly property InstrumentCluster clusterSettings: InstrumentCluster {}
+}
diff --git a/apps/com.luxoft.vehicle/stores/qmldir b/apps/com.luxoft.vehicle/stores/qmldir
index 213b520f..53e223ee 100644
--- a/apps/com.luxoft.vehicle/stores/qmldir
+++ b/apps/com.luxoft.vehicle/stores/qmldir
@@ -1 +1,2 @@
VehicleStore 1.0 VehicleStore.qml
+VehicleStoreIC 1.0 VehicleStoreIC.qml
diff --git a/apps/com.luxoft.vehicle/views/VehicleICView.qml b/apps/com.luxoft.vehicle/views/VehicleICView.qml
index b46756f4..1024eab1 100644
--- a/apps/com.luxoft.vehicle/views/VehicleICView.qml
+++ b/apps/com.luxoft.vehicle/views/VehicleICView.qml
@@ -32,8 +32,6 @@
import QtQuick 2.2
-import shared.utils 1.0
-
import shared.Sizes 1.0
import "../panels" 1.0
@@ -42,7 +40,7 @@ import "../stores" 1.0
Item {
id: root
- property VehicleStore store
+ property VehicleStoreIC store
Vehicle2DPanel {
anchors.top: root.top
diff --git a/apps/com.luxoft.vehicle/views/VehicleView.qml b/apps/com.luxoft.vehicle/views/VehicleView.qml
index 4ed33f4c..04f857ee 100644
--- a/apps/com.luxoft.vehicle/views/VehicleView.qml
+++ b/apps/com.luxoft.vehicle/views/VehicleView.qml
@@ -45,6 +45,10 @@ Item {
id: root
property VehicleStore store
+
+ // This timer is used to make the order of creation transparent
+ // 1) read settings (reread to be sure, it's a synch op), get chosen runtime
+ // 2) load the chosen model
Timer {
id: delayTimer
interval: 1
@@ -55,12 +59,35 @@ Item {
}
}
+ // This timer is a workaround to prevent 3DStudio presentation from too fast reload
+ Timer {
+ id: studioReloadTimer
+ interval: 2000
+ running: false
+ onTriggered: {
+ loadVehiclePanel();
+ }
+ }
+
+ // we don't change visible manually, it is changed by sysui, when another app is called
+ // or the same app is called again, even if it is maximized right now
onVisibleChanged: {
- if (!visible) {
- vehicle3DPanelLoader.active = false;
- } else {
- if (!delayTimer.running && !vehicle3DPanelLoader.active)
- loadVehiclePanel();
+ // the app was already launched and is restored (e.g. Vehicle -> Home -> Vehicle)
+ if (root.store.runtime3D === "qt3d") {
+ if (visible && !!vehicle3DPanelLoader.item) {
+ // vehicle is loaded, but it is hidden (AUTOSUITE-1598)
+ // we force redraw, to make it visible
+ vehicle3DPanelLoader.item.forceRedraw();
+ }
+ } else if (root.store.runtime3D === "3DStudio") {
+ if (!visible && !!vehicle3DPanelLoader.item) {
+ vehicle3DPanelLoader.source = "" // force to remove current instance
+ }
+
+ if (visible) {
+ vehicleProxyPanel.opacity = 1.0; // enable proxy with the progress bar
+ studioReloadTimer.start();
+ }
}
}
@@ -71,14 +98,14 @@ Item {
? "../panels/Vehicle3DPanel.qml" : "../panels/Vehicle3DStudioPanel.qml"
, {
"leftDoorOpen": root.store.leftDoorOpened
- , "rightDoorOpen": root.store.rightDoorOpen
- , "trunkOpen": root.store.trunkOpen
+ , "rightDoorOpen": root.store.rightDoorOpened
+ , "trunkOpen": root.store.trunkOpened
, "roofOpenProgress": root.store.roofOpenProgress
- , "lastCameraAngle": root.store.lastCameraAngle
- , "modelVersion": root.store.modelVersion
+ , "lastCameraAngle": root.store.cameraAngleView
+ , "modelVersion": root.store.model3DVersion
, "vehicleColor": root.store.vehicle3DstudioColor
});
- vehicle3DPanelLoader.active = true;
+ vehicle3DPanelLoader.active = store.allowOpenGLContent;
}
Item {
@@ -99,27 +126,20 @@ Item {
Connections {
target: vehicle3DPanelLoader.item
- onLastCameraAngleChanged: root.store.cameraAngleView = target.lastCameraAngle
+ function onLastCameraAngleChanged() {
+ root.store.cameraAngleView = target.lastCameraAngle;
+ }
}
VehicleProxyPanel {
id: vehicleProxyPanel
z: 9999
- }
-
- // In some cases Scene3D doesn't create anything, such cases are really hard to reproduce,
- // in these situations UI is frozen, timer is used to check that rendering is started
- Timer {
- id: reloadTimer
- interval: 30000
- onTriggered: {
- // if after 30s qt3d scene doesn't respond even with first frame we try to reload it
- if (store.runtime3D === "qt3d" && !vehicle3DPanelLoader.item.renderStarted) {
- vehicle3DPanelLoader.active = false;
- vehicle3DPanelLoader.setSource("");
- vehicle3DPanelLoader.active = true;
- loadVehiclePanel();
- }
+ visible: opacity != 0.0
+ errorText: store.allowOpenGLContent
+ ? ""
+ : qsTr("The 3D car model is disabled in this runtime environment")
+ Behavior on opacity {
+ DefaultNumberAnimation {}
}
}
@@ -127,25 +147,18 @@ Item {
id: vehicle3DPanelLoader
anchors.fill: parent
active: false
- opacity: active ? 1.0 : 0.0
asynchronous: true
- Behavior on opacity {
- DefaultNumberAnimation {}
- }
onItemChanged: {
if (item) {
var currentRuntimeQt3D = store.runtime3D === "qt3d";
- reloadTimer.running = currentRuntimeQt3D;
if (currentRuntimeQt3D) {
item.modelVersion = Qt.binding( function() {return root.store.model3DVersion});
- reloadTimer.running = Qt.binding( function() {return item ? !item.renderStarted : false} );
} else {
item.vehicleColor = Qt.binding( function() {return root.store.vehicle3DstudioColor});
- reloadTimer.stop();
}
- vehicleProxyPanel.visible = Qt.binding( function() {return !item.readyToChanges} );
+ vehicleProxyPanel.opacity = Qt.binding(() => !!item && item.readyToChanges ? 0.0 : 1.0);
item.leftDoorOpen = Qt.binding( function() {return root.store.leftDoorOpened} );
item.rightDoorOpen = Qt.binding( function() {return root.store.rightDoorOpened});
@@ -174,13 +187,15 @@ Item {
leftDoorOpened: root.store.leftDoorOpened
rightDoorOpened: root.store.rightDoorOpened
trunkOpened: root.store.trunkOpened
+ roofOpenProgress: root.store.roofOpenProgress
qt3DStudioAvailable: root.store.qt3DStudioAvailable
+ enableOpacityMasks: store.allowOpenGLContent
onLeftDoorClicked: root.store.setLeftDoor()
onRightDoorClicked: root.store.setRightDoor()
onTrunkClicked: root.store.setTrunk()
- onRoofOpenProgressChanged: root.store.setRoofOpenProgress(value)
+ onNewRoofOpenProgressRequested: root.store.setRoofOpenProgress(progress)
onRuntimeChanged: { root.store.setRuntime(runtime); }
@@ -192,5 +207,6 @@ Item {
}
onShowNotificationAboutChange: store.showNotificationAboutChange()
+ onIntentToMapRequested: { root.store.createIntentToMap(intentId, params) }
}
}
diff --git a/apps/com.pelagicore.apps.settings/Main.qml b/apps/com.pelagicore.apps.settings/Main.qml
index 766a5520..82c885b3 100644
--- a/apps/com.pelagicore.apps.settings/Main.qml
+++ b/apps/com.pelagicore.apps.settings/Main.qml
@@ -61,7 +61,7 @@ ApplicationCCWindow {
y: root.exposedRect.y
width: root.exposedRect.width
height: root.exposedRect.height
- store: RootStore {}
+ store: RootStore { onRequestRaiseAppReceived: root.riseWindow() }
wifi: store.wifi
rootItem: root.contentItem
}
diff --git a/apps/com.pelagicore.apps.settings/controls/ColorSelector.qml b/apps/com.pelagicore.apps.settings/controls/ColorSelector.qml
index 4e956b03..213debd1 100644
--- a/apps/com.pelagicore.apps.settings/controls/ColorSelector.qml
+++ b/apps/com.pelagicore.apps.settings/controls/ColorSelector.qml
@@ -45,8 +45,8 @@ Control {
signal accentColorRequested(color accentColor)
background: Image {
- height: Sizes.dp(sourceSize.width)
width: Sizes.dp(sourceSize.width)
+ height: width
source: Style.image("colorSelector/color-wheel")
Image {
@@ -59,43 +59,16 @@ Control {
MouseArea {
anchors.fill: parent
onClicked: {
- // find out which area is clicked
-
- if (mouseX > width / 2) {
- //left
- if (mouseY < height / 2) {
- //top left
- if (mouseX < height - mouseY) {
- root.accentColorRequested(chartData[0].color);
- } else {
- root.accentColorRequested(chartData[1].color);
- }
- } else {
- //bottom left
- if (mouseX > mouseY) {
- root.accentColorRequested(chartData[2].color);
- } else {
- root.accentColorRequested(chartData[3].color);
- }
- }
-
- } else {
- //right
- if (mouseY < height / 2) {
- //top right
- if (mouseX < mouseY) {
- root.accentColorRequested(chartData[6].color);
- } else {
- root.accentColorRequested(chartData[7].color);
- }
- } else {
- //bottom right
- if (mouseX > height - mouseY) {
- root.accentColorRequested(chartData[4].color);
- } else {
- root.accentColorRequested(chartData[5].color);
- }
- }
+ // circle with chartData.length sectors, the selected one is bigger then others
+ // here we decide on which area click/touch was made
+ var x0 = parent.width / 2;
+ var y0 = parent.height / 2;
+ var distance = Math.sqrt((mouseX - x0) ** 2 + (mouseY - y0) ** 2);
+ if (distance > parent.width / 20 && chartData.length > 0) {
+ var sector = 2 * Math.PI / chartData.length;
+ var angle = Math.atan2(mouseY - y0, mouseX - x0) + Math.PI / 2;
+ angle = angle < 0.0 ? angle + 2 * Math.PI : angle;
+ root.accentColorRequested(chartData[(angle / sector) | 0].color);
}
}
}
diff --git a/apps/com.pelagicore.apps.settings/info.yaml b/apps/com.pelagicore.apps.settings/info.yaml
index f0d9c380..0721bf78 100644
--- a/apps/com.pelagicore.apps.settings/info.yaml
+++ b/apps/com.pelagicore.apps.settings/info.yaml
@@ -1,10 +1,8 @@
formatVersion: 1
-formatType: am-application
+formatType: am-package
---
id: 'com.pelagicore.apps.settings'
icon: 'icon.png'
-code: 'Main.qml'
-runtime: 'qml'
name:
en: 'General Settings'
cs: 'Obecná nastavení'
@@ -14,5 +12,13 @@ name:
ja: '一般設定'
ko: '일반 설정'
-applicationProperties: { private: { squishPort: 7729 } }
+applications:
+ - id: 'com.pelagicore.apps.settings'
+ code: 'Main.qml'
+ runtime: 'qml'
+ applicationProperties: { private: { squishPort: 7729 } }
+
categories: [ 'app' ]
+intents:
+- id: activate-app
+- id: set-next-accent-color
diff --git a/apps/com.pelagicore.apps.settings/panels/ConnectivityPanel.qml b/apps/com.pelagicore.apps.settings/panels/ConnectivityPanel.qml
index d62964c0..3b2fd732 100644
--- a/apps/com.pelagicore.apps.settings/panels/ConnectivityPanel.qml
+++ b/apps/com.pelagicore.apps.settings/panels/ConnectivityPanel.qml
@@ -55,7 +55,7 @@ Control {
ListItem {
id: wifiItem
width: root.width
- text: "WiFi"
+ text: qsTr("Wi-Fi")
rightToolSymbol: "ic-next-level"
enabled: root.wifiAvailable
onClicked: root.wifiClicked()
@@ -64,7 +64,7 @@ Control {
ListItem {
id: hotspotItem
width: root.width
- text: "Hotspot"
+ text: qsTr("Hotspot")
rightToolSymbol: "ic-next-level"
enabled: root.wifiAvailable
onClicked: root.hotspotClicked()
@@ -73,7 +73,7 @@ Control {
ListItem {
id: bluetoothItem
width: root.width
- text: "Bluetooth"
+ text: qsTr("Bluetooth")
rightToolSymbol: "ic-next-level"
dividerVisible: false
}
diff --git a/apps/com.pelagicore.apps.settings/panels/HotspotPanel.qml b/apps/com.pelagicore.apps.settings/panels/HotspotPanel.qml
index 4ca26ccd..8cd8380d 100644
--- a/apps/com.pelagicore.apps.settings/panels/HotspotPanel.qml
+++ b/apps/com.pelagicore.apps.settings/panels/HotspotPanel.qml
@@ -86,7 +86,7 @@ Control {
horizontalAlignment: Text.AlignHCenter
font.pixelSize: Sizes.fontSizeS
elide: Text.ElideRight
- text: "Hotspot"
+ text: qsTr("Hotspot")
}
Rectangle {
id: headerDivider
@@ -104,7 +104,7 @@ Control {
}
SwitchDelegate {
- text: "Hotspot Enabled"
+ text: qsTr("Hotspot Enabled")
width: root.width
checked: root.hotspotEnabled
onToggled: root.hotspotEnabled = checked
@@ -120,7 +120,7 @@ Control {
Label {
id: ssidTitle
width: root.width
- text: "SSID"
+ text: qsTr("SSID")
font.pixelSize: Sizes.fontSizeS
elide: Text.ElideRight
color: Style.contrastColor
@@ -162,7 +162,7 @@ Control {
Label {
id: passwTitle
width: root.width
- text: "Password"
+ text: qsTr("Password")
font.pixelSize: Sizes.fontSizeS
elide: Text.ElideRight
color: Style.contrastColor
diff --git a/apps/com.pelagicore.apps.settings/panels/LanguagePanel.qml b/apps/com.pelagicore.apps.settings/panels/LanguagePanel.qml
index 71a9ae95..f978940d 100644
--- a/apps/com.pelagicore.apps.settings/panels/LanguagePanel.qml
+++ b/apps/com.pelagicore.apps.settings/panels/LanguagePanel.qml
@@ -60,10 +60,11 @@ Control {
height: Sizes.dp(110)
checked: (model.language === root.currentLanguage)
- Cursor { }
+ Cursor {
+ onActivated: { root.languageRequested(model.language, model.title); }
+ }
- onClicked: { root.languageRequested(model.language, model.title); }
- onToggled: { languageDelegate.clicked(); }
+ onToggled: { root.languageRequested(model.language, model.title); }
indicator: Rectangle {
implicitWidth: Sizes.dp(30)
diff --git a/apps/com.pelagicore.apps.settings/panels/WiFiPanel.qml b/apps/com.pelagicore.apps.settings/panels/WiFiPanel.qml
index 6ff0ee6d..ec11c497 100644
--- a/apps/com.pelagicore.apps.settings/panels/WiFiPanel.qml
+++ b/apps/com.pelagicore.apps.settings/panels/WiFiPanel.qml
@@ -97,7 +97,7 @@ Control {
horizontalAlignment: Text.AlignHCenter
font.pixelSize: Sizes.fontSizeS
elide: Text.ElideRight
- text: "WiFi"
+ text: qsTr("Wi-Fi")
}
Rectangle {
id: headerDivider
@@ -115,7 +115,7 @@ Control {
}
SwitchDelegate {
- text: "WiFi Enabled"
+ text: qsTr("Wi-Fi Enabled")
width: root.width
checked: root.wifiEnabled
onToggled: root.wifiEnabled = checked
@@ -153,7 +153,7 @@ Control {
rightPadding: Sizes.dp(30)
topPadding: Sizes.dp(8)
bottomPadding: Sizes.dp(8)
- text: "Disconnect"
+ text: qsTr("Disconnect")
enabled: root.selectedWiFiStatus !== "Disconnecting"
font.pixelSize: Sizes.fontSizeS
onClicked: root.disconnectFromWiFiClicked( root.selectedWiFiSSID )
@@ -206,7 +206,7 @@ Control {
}
}
text: model.modelData.ssid
- secondaryText: model.modelData.connected ? "Connected" : ""
+ secondaryText: model.modelData.connected ? qsTr("Connected") : ""
rightToolSymbol: model.modelData.security != 0 ? "ic_secured_connection" : ""
dividerVisible: index !== wifiListView.count - 1
onClicked: root.connectToWiFiClicked(model.modelData.ssid)
diff --git a/apps/com.pelagicore.apps.settings/popups/WiFiPopup.qml b/apps/com.pelagicore.apps.settings/popups/WiFiPopup.qml
index 430299ed..657a9827 100644
--- a/apps/com.pelagicore.apps.settings/popups/WiFiPopup.qml
+++ b/apps/com.pelagicore.apps.settings/popups/WiFiPopup.qml
@@ -54,113 +54,115 @@ PopupWindow {
property bool okClicked: false
}
- Label {
- anchors.baseline: parent.top
- anchors.baselineOffset: Sizes.dp(78)
- font.pixelSize: Sizes.fontSizeM
- width: parent.width
- text: !root.manual ? "Input password" : "Manual connection"
- horizontalAlignment: Text.AlignHCenter
- }
- Image {
- id: shadow
- anchors.top: parent.top
- anchors.topMargin: Sizes.dp(120)
- width: parent.width
- height: Sizes.dp(sourceSize.height)
- source: Style.image("popup-title-shadow")
- }
-
- ColumnLayout {
- id: columnFields
- spacing: Sizes.dp(50)
- anchors.top: parent.top
- anchors.topMargin: Sizes.dp(170)
- anchors.left: parent.left
- anchors.leftMargin: Sizes.dp(100)
- anchors.right: parent.right
- anchors.rightMargin: Sizes.dp(100)
+ Item {
+ width: root.width
+ height: root.height
Label {
- id: ssidTitle
- Layout.preferredHeight: Sizes.dp(50)
- Layout.alignment: Qt.AlignBottom | Qt.AlignLeft
- verticalAlignment: Text.AlignBottom
- Layout.bottomMargin: -Sizes.dp(25)
- text: "SSID"
- font.pixelSize: Sizes.fontSizeS
- elide: Text.ElideRight
- color: Style.contrastColor
+ anchors.baseline: parent.top
+ anchors.baselineOffset: Sizes.dp(78)
+ font.pixelSize: Sizes.fontSizeM
+ width: parent.width
+ text: !root.manual ? qsTr("Input password") : qsTr("Manual connection")
+ horizontalAlignment: Text.AlignHCenter
+ }
+ Image {
+ anchors.top: parent.top
+ anchors.topMargin: Sizes.dp(120)
+ width: parent.width
+ height: Sizes.dp(sourceSize.height)
+ source: Style.image("popup-title-shadow")
}
- TextField {
- id: ssidTextField
- Layout.fillWidth: true
- Layout.preferredHeight: Sizes.dp(100)
- font.family: Style.fontFamily
- font.pixelSize: Sizes.fontSizeM
- color: Style.contrastColor
- selectedTextColor: Style.contrastColor
- leftPadding: Sizes.dp(18)
- rightPadding: Sizes.dp(63)
- horizontalAlignment: TextInput.AlignLeft
- readOnly: !root.manual
-
- background: Rectangle {
- border.color: Style.buttonColor
- border.width: Sizes.dp(1)
- color: "transparent"
- radius: height/2
+ ColumnLayout {
+ id: columnFields
+ spacing: Sizes.dp(50)
+ anchors.top: parent.top
+ anchors.topMargin: Sizes.dp(170)
+ anchors.left: parent.left
+ anchors.leftMargin: Sizes.dp(100)
+ anchors.right: parent.right
+ anchors.rightMargin: Sizes.dp(100)
+
+ Label {
+ Layout.preferredHeight: Sizes.dp(50)
+ Layout.alignment: Qt.AlignBottom | Qt.AlignLeft
+ verticalAlignment: Text.AlignBottom
+ Layout.bottomMargin: -Sizes.dp(25)
+ text: qsTr("SSID")
+ font.pixelSize: Sizes.fontSizeS
+ elide: Text.ElideRight
+ color: Style.contrastColor
}
- }
- Label {
- id: passwTitle
- Layout.preferredHeight: Sizes.dp(50)
- Layout.alignment: Qt.AlignBottom | Qt.AlignLeft
- verticalAlignment: Text.AlignBottom
- Layout.bottomMargin: -Sizes.dp(25)
- text: "Password"
- font.pixelSize: Sizes.fontSizeS
- elide: Text.ElideRight
- color: Style.contrastColor
- }
+ TextField {
+ id: ssidTextField
+ Layout.fillWidth: true
+ Layout.preferredHeight: Sizes.dp(100)
+ font.family: Style.fontFamily
+ font.pixelSize: Sizes.fontSizeM
+ color: Style.contrastColor
+ selectedTextColor: Style.contrastColor
+ leftPadding: Sizes.dp(18)
+ rightPadding: Sizes.dp(63)
+ horizontalAlignment: TextInput.AlignLeft
+ readOnly: !root.manual
+
+ background: Rectangle {
+ border.color: Style.buttonColor
+ border.width: 1
+ color: "transparent"
+ radius: height/2
+ }
+ }
- TextField {
- id: passwTextField
- Layout.fillWidth: true
- Layout.preferredHeight: Sizes.dp(100)
- font.family: Style.fontFamily
- font.pixelSize: Sizes.fontSizeM
- color: Style.contrastColor
- selectedTextColor: Style.contrastColor
- leftPadding: Sizes.dp(18)
- rightPadding: Sizes.dp(63)
- horizontalAlignment: TextInput.AlignLeft
-
- background: Rectangle {
- border.color: Style.buttonColor
- border.width: Sizes.dp(1)
- color: "transparent"
- radius: height/2
+ Label {
+ Layout.preferredHeight: Sizes.dp(50)
+ Layout.alignment: Qt.AlignBottom | Qt.AlignLeft
+ verticalAlignment: Text.AlignBottom
+ Layout.bottomMargin: -Sizes.dp(25)
+ text: qsTr("Password")
+ font.pixelSize: Sizes.fontSizeS
+ elide: Text.ElideRight
+ color: Style.contrastColor
+ }
+ TextField {
+ id: passwTextField
+ Layout.fillWidth: true
+ Layout.preferredHeight: Sizes.dp(100)
+ font.family: Style.fontFamily
+ font.pixelSize: Sizes.fontSizeM
+ color: Style.contrastColor
+ selectedTextColor: Style.contrastColor
+ leftPadding: Sizes.dp(18)
+ rightPadding: Sizes.dp(63)
+ horizontalAlignment: TextInput.AlignLeft
+
+ background: Rectangle {
+ border.color: Style.buttonColor
+ border.width: 1
+ color: "transparent"
+ radius: height/2
+
+ }
}
- }
- }
- Button {
- anchors.top: columnFields.bottom
- anchors.topMargin: Sizes.dp(100)
- anchors.right: parent.right
- anchors.rightMargin: Sizes.dp(100)
- width: Sizes.dp(315)
- height: Sizes.dp(64)
- font.pixelSize: Sizes.fontSizeS
- text: "Connect"
- onClicked: {
- p.okClicked = true;
- root.close();
- root.connectClicked(ssidTextField.text, passwTextField.text);
+ }
+ Button {
+ anchors.top: columnFields.bottom
+ anchors.topMargin: Sizes.dp(100)
+ anchors.right: parent.right
+ anchors.rightMargin: Sizes.dp(100)
+ width: Sizes.dp(315)
+ height: Sizes.dp(64)
+ font.pixelSize: Sizes.fontSizeS
+ text: qsTr("Connect")
+ onClicked: {
+ p.okClicked = true;
+ root.connectClicked(ssidTextField.text, passwTextField.text);
+ root.close();
+ }
}
}
diff --git a/apps/com.pelagicore.apps.settings/store/RootStore.qml b/apps/com.pelagicore.apps.settings/store/RootStore.qml
index 9d401f40..8abbdb6d 100644
--- a/apps/com.pelagicore.apps.settings/store/RootStore.qml
+++ b/apps/com.pelagicore.apps.settings/store/RootStore.qml
@@ -32,6 +32,9 @@
import QtQml 2.2
import QtQml.Models 2.3
+
+import QtApplicationManager.Application 2.0
+
import shared.utils 1.0
import shared.Style 1.0
import shared.Connectivity 1.0
@@ -77,6 +80,7 @@ QtObject {
function updateLanguage(languageCode, language) {
console.log(helper.category, 'updateLanguage: ' + languageCode)
uiSettings.setLanguage(languageCode);
+ uiSettings.setRtlMode(Qt.locale(languageCode).textDirection === Qt.RightToLeft);
helper.showNotification(qsTr("UI Language changed"), qsTr("UI Language changed into %1 (%2)").arg(language).arg(languageCode));
}
@@ -86,11 +90,7 @@ QtObject {
}
// Accent Colors & themes segment
- property bool startupAccentColor: true
property var accentColorsModel: Config._initAccentColors(uiSettings.theme)
- property string lighThemeLastAccColor: "#d35756"
- property string darkThemeLastAccColor: "#b75034"
-
readonly property ListModel themeModel: ListModel {
// TODO: This data will be populated from settings server later
// the server stores the "theme" as an integer
@@ -101,47 +101,64 @@ QtObject {
readonly property UISettings uiSettings: UISettings {
onAccentColorChanged: {
root.accentColorsModel.forEach(function(element) {
- var c1 = Qt.lighter(element.color, 1.0)
- var c2 = Qt.lighter(accentColor, 1.0)
- element.selected = Qt.colorEqual(element.color, accentColor)
- || Math.abs(c1.r - c2.r) + Math.abs(c1.g - c2.g) + Math.abs(c1.b - c2.b) < 0.01;
-
+ element.selected = Qt.colorEqual(element.color, accentColor);
});
- if (startupAccentColor) {
- //Prevent setting back light theme's last accent color in cases when the UI
- //was closed with light theme set. If this is the case, reset dark theme's
- //default accent color.
- var accColorInPalette = root.accentColorsModel.find(function(color) {
- return (color.color === accentColor);
- });
- if (accColorInPalette === undefined) {
- uiSettings.accentColor = accentColorsModel[0].color;
- }
- startupAccentColor = false;
+ }
+ }
+
+ function selectNextAccentColor() {
+ var selected = -1;
+ for (var i = 0; i < root.accentColorsModel.length; ++i) {
+ if (root.accentColorsModel[i].selected === true) {
+ selected = i;
+ break;
}
}
+
+ if (selected >= 0) {
+ root.accentColorsModel[selected].selected = false;
+ selected = selected === root.accentColorsModel.length - 1 ? 0 : selected + 1;
+ root.accentColorsModel[selected].selected = true;
+ updateAccentColor(root.accentColorsModel[selected].color);
+ }
}
function updateAccentColor(value) {
+ console.log(helper.category, 'updateAccentColor: ', value)
uiSettings.accentColor = value;
+ helper.showNotification(qsTr("UI Accent Color changed"), qsTr("UI Accent Color changed into %1").arg(value));
}
+ //value: 1 -- dark, 0 -- light
function updateTheme(value) {
- if (value === 1 && (root.lighThemeLastAccColor !== uiSettings.accentColor)) {
- root.lighThemeLastAccColor = uiSettings.accentColor;
- } else if (value === 0 && (root.darkThemeLastAccColor !== uiSettings.accentColor)) {
- root.darkThemeLastAccColor = uiSettings.accentColor;
- }
+ console.log(helper.category, 'updateTheme: ', value)
uiSettings.setTheme(value);
- //set previous to theme accentColor
- if (lighThemeLastAccColor !== "" && value === 0) {
- updateAccentColor(root.lighThemeLastAccColor);
- } else if (darkThemeLastAccColor !== "" && value === 1) {
- updateAccentColor(root.darkThemeLastAccColor);
- } else {
- updateAccentColor(root.accentColorsModel[0].color);
+ if (value === 0) {
+ helper.showNotification(qsTr("UI Theme changed"), qsTr("UI Theme changed into Light Theme"));
+ } else if (value === 1) {
+ helper.showNotification(qsTr("UI Theme changed"), qsTr("UI Theme changed into Dark Theme"));
+ }
+ }
+
+ readonly property IntentHandler intentHandler: IntentHandler {
+ intentIds: ["activate-app", "set-next-accent-color"]
+ onRequestReceived: {
+ switch (request.intentId) {
+ case "activate-app":
+ root.requestRaiseAppReceived()
+ request.sendReply({ "done": true })
+ break;
+ case "set-next-accent-color":
+ selectNextAccentColor();
+ request.sendReply({ "done": true })
+ break;
+ default:
+ request.sendReply({ "done": true })
+ break;
+ }
}
}
+ signal requestRaiseAppReceived()
// Initialization
Component.onCompleted: {
diff --git a/apps/com.pelagicore.apps.settings/views/SettingsView.qml b/apps/com.pelagicore.apps.settings/views/SettingsView.qml
index f07c006b..c19f44fa 100644
--- a/apps/com.pelagicore.apps.settings/views/SettingsView.qml
+++ b/apps/com.pelagicore.apps.settings/views/SettingsView.qml
@@ -53,15 +53,13 @@ Control {
property Item rootItem
property QtObject wifi
+ property int wifiPopupWidth: Sizes.dp(910);
+ property int wifiPopupHeight : Sizes.dp(820);
+
WiFiPopup {
id: wifiPopup
+
manual: false
- readonly property point pos: mapToItem(root, width/2, height/2)
- width: Sizes.dp(910)
- height: Sizes.dp(820)
- originItemX: pos.x
- originItemY: pos.y
- popupY: Sizes.dp(Math.round(Config.centerConsoleHeight/2 - 410))
onConnectClicked: wifi.sendCredentials(ssid, password)
onCancelClicked: wifi.disconnectFromAccessPoint(wifi.activeAccessPoint.ssid)
}
@@ -87,6 +85,7 @@ Control {
ToolsColumn {
id: toolsColumn
+ width: Sizes.dp(140)
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top
anchors.topMargin: Sizes.dp(53)
@@ -98,19 +97,19 @@ Control {
ListModel {
id: fullTabsModel
- ListElement { text: QT_TRANSLATE_NOOP("SettingsToolsColumn", "connectivity"); icon: 'ic-connectivity'; objectName: "connectivityViewButton" }
ListElement { text: QT_TRANSLATE_NOOP("SettingsToolsColumn", "languages"); icon: 'ic-languages'; objectName: "languageViewButton"}
ListElement { text: QT_TRANSLATE_NOOP("SettingsToolsColumn", "date"); icon: 'ic-time'; objectName: "dateViewButton" }
ListElement { text: QT_TRANSLATE_NOOP("SettingsToolsColumn", "themes"); icon: 'ic-themes'; objectName: "themesViewButton" }
ListElement { text: QT_TRANSLATE_NOOP("SettingsToolsColumn", "colors"); icon: 'ic-color'; objectName: "colorsViewButton" }
+ ListElement { text: QT_TRANSLATE_NOOP("SettingsToolsColumn", "network"); icon: 'ic-connectivity'; objectName: "connectivityViewButton" }
}
ListModel {
id: themelessTabsModel
- ListElement { text: QT_TRANSLATE_NOOP("SettingsToolsColumn", "connectivity"); icon: 'ic-connectivity'; objectName: "connectivityViewButton" }
ListElement { text: QT_TRANSLATE_NOOP("SettingsToolsColumn", "languages"); icon: 'ic-languages'; objectName: "languageViewButton"}
ListElement { text: QT_TRANSLATE_NOOP("SettingsToolsColumn", "date"); icon: 'ic-time'; objectName: "dateViewButton" }
ListElement { text: QT_TRANSLATE_NOOP("SettingsToolsColumn", "colors"); icon: 'ic-color'; objectName: "colorsViewButton" }
+ ListElement { text: QT_TRANSLATE_NOOP("SettingsToolsColumn", "network"); icon: 'ic-connectivity'; objectName: "connectivityViewButton" }
}
}
}
@@ -141,6 +140,10 @@ Control {
WiFiPanel {
id: wifiPanel
+
+ property int wifiPopupWidth: Sizes.dp(910);
+ property int wifiPopupHeight : Sizes.dp(820);
+
objectName: "wifiPanel"
anchors.fill: parent
visible: toolsColumn.currentIcon === 'ic-connectivity' && connectivityPanel.view === 1
@@ -169,8 +172,15 @@ Control {
Connections {
target: wifi
- onCredentialsRequested: {
+ function onCredentialsRequested(ssid) {
wifiPopup.ssid = ssid;
+ wifiPopup.width = Qt.binding(() => wifiPanel.wifiPopupWidth);
+ wifiPopup.height = Qt.binding(() => wifiPanel.wifiPopupHeight);
+ wifiPopup.originItemX = Qt.binding(() => root.width / 2);
+ wifiPopup.originItemY = Qt.binding(() => root.heigh / 2);
+ wifiPopup.popupY = Qt.binding(() => {
+ return Sizes.dp(root.height/2 - wifiPopup.height/2);
+ });
wifiPopup.visible = true;
}
}
diff --git a/apps/com.pelagicore.calendar/Main.qml b/apps/com.pelagicore.calendar/Main.qml
index 724a96fc..e839a46b 100644
--- a/apps/com.pelagicore.calendar/Main.qml
+++ b/apps/com.pelagicore.calendar/Main.qml
@@ -57,7 +57,7 @@ ApplicationCCWindow {
state: root.neptuneState
bottomWidgetHide: root.exposedRect.height === root.targetHeight
- store: CalendarStore { }
+ store: CalendarStore { onRequestRaiseAppReceived: root.riseWindow(); }
}
}
diff --git a/apps/com.pelagicore.calendar/info.yaml b/apps/com.pelagicore.calendar/info.yaml
index 2be863fc..8281686e 100644
--- a/apps/com.pelagicore.calendar/info.yaml
+++ b/apps/com.pelagicore.calendar/info.yaml
@@ -1,10 +1,8 @@
formatVersion: 1
-formatType: am-application
+formatType: am-package
---
id: 'com.pelagicore.calendar'
icon: 'icon.png'
-code: 'Main.qml'
-runtime: 'qml'
name:
en: 'Calendar'
de: 'Kalender'
@@ -14,5 +12,12 @@ name:
ja: 'カレンダー'
ko: '달력'
-applicationProperties: { private: { squishPort: 7721 } }
+applications:
+ - id: 'com.pelagicore.calendar'
+ code: 'Main.qml'
+ runtime: 'qml'
+ applicationProperties: { private: { squishPort: 7721 } }
+
categories: [ 'productivity', 'widget' ]
+intents:
+- id: activate-app
diff --git a/apps/com.pelagicore.calendar/panels/+lucee/CalendarWidgetPanel.qml b/apps/com.pelagicore.calendar/panels/+lucee/CalendarWidgetPanel.qml
index 6edb6c1a..cb7f351c 100644
--- a/apps/com.pelagicore.calendar/panels/+lucee/CalendarWidgetPanel.qml
+++ b/apps/com.pelagicore.calendar/panels/+lucee/CalendarWidgetPanel.qml
@@ -70,7 +70,7 @@ Item {
anchors.horizontalCenter: dummyWeatherImg.horizontalCenter
anchors.top: dummyWeatherImg.bottom
anchors.topMargin: Sizes.dp(37)
- text: "Partly sunny, 21°C"
+ text: qsTr("Partly sunny, 21°C")
font.pixelSize: Sizes.dp(26)
font.weight: Font.Normal
visible: root.state !== "Widget1Row"
@@ -97,7 +97,7 @@ Item {
anchors.leftMargin: Sizes.dp(10)
anchors.bottom: dummyWeatherImg.bottom
anchors.bottomMargin: Sizes.dp(10)
- text: "21°C"
+ text: qsTr("21°C")
font.pixelSize: Sizes.dp(26)
font.weight: Font.Normal
visible: opacity > 0.0
@@ -152,7 +152,7 @@ Item {
Connections {
target: root
- onDateClicked: {
+ function onDateClicked() {
weatherIcon.randomIndex = Math.floor((Math.random() * (3)) + 0);
}
}
diff --git a/apps/com.pelagicore.calendar/panels/CalendarMaximizedPanel.qml b/apps/com.pelagicore.calendar/panels/CalendarMaximizedPanel.qml
index d0563b0f..6eee833c 100644
--- a/apps/com.pelagicore.calendar/panels/CalendarMaximizedPanel.qml
+++ b/apps/com.pelagicore.calendar/panels/CalendarMaximizedPanel.qml
@@ -96,17 +96,17 @@ Item {
Column {
spacing: Sizes.dp(20)
Label {
- text: "Partly sunny, 21°C"
+ text: qsTr("Partly sunny, 21°C")
font.pixelSize: Sizes.dp(27)
}
Label {
- text: "Today: Mostly sunny,\nthe highest temperature will be 26°."
+ text: qsTr("Today: Mostly sunny,\nthe highest temperature will be 26°.")
font.pixelSize: Sizes.dp(18)
}
Label {
- text: "Tonight: Mostly cloudy with light rain,\ntemperatures between 14° and 18°."
+ text: qsTr("Tonight: Mostly cloudy with light rain,\ntemperatures between 14° and 18°.")
font.pixelSize: Sizes.dp(18)
}
}
@@ -219,14 +219,16 @@ Item {
Repeater {
model: 4
Image {
+ id: weatherIcon
+
width: Sizes.dp(80)
height: Sizes.dp(80)
fillMode: Image.PreserveAspectFit
Connections {
target: root
- onDateClicked: {
- randomIndex = Math.floor((Math.random() * (3)) + 0);
+ function onDateClicked() {
+ weatherIcon.randomIndex = Math.floor((Math.random() * (3)) + 0);
}
}
@@ -255,12 +257,14 @@ Item {
delegatedItemWidth: eventList.width
interactive: false
delegate: EventListItem {
+ id: item
+
property int randomIndex: Math.floor((Math.random() * (8)) + 0)
Connections {
target: root
- onDateClicked: {
- randomIndex = Math.floor((Math.random() * (8)) + 0);
+ function onDateClicked() {
+ item.randomIndex = Math.floor((Math.random() * (8)) + 0);
}
}
diff --git a/apps/com.pelagicore.calendar/stores/CalendarStore.qml b/apps/com.pelagicore.calendar/stores/CalendarStore.qml
index 59bd6faa..7b02e6ea 100644
--- a/apps/com.pelagicore.calendar/stores/CalendarStore.qml
+++ b/apps/com.pelagicore.calendar/stores/CalendarStore.qml
@@ -32,6 +32,7 @@
import QtQuick 2.8
import shared.utils 1.0
+import QtApplicationManager.Application 2.0
Store {
id: root
@@ -95,4 +96,12 @@ Store {
}
}
+ readonly property IntentHandler intentHandler: IntentHandler {
+ intentIds: "activate-app"
+ onRequestReceived: {
+ root.requestRaiseAppReceived()
+ request.sendReply({ "done": true })
+ }
+ }
+ signal requestRaiseAppReceived()
}
diff --git a/apps/com.pelagicore.climate/controls/+lucee/TemperatureLabel.qml b/apps/com.pelagicore.climate/controls/+lucee/TemperatureLabel.qml
index 9e167460..0c4fcd9f 100644
--- a/apps/com.pelagicore.climate/controls/+lucee/TemperatureLabel.qml
+++ b/apps/com.pelagicore.climate/controls/+lucee/TemperatureLabel.qml
@@ -40,10 +40,10 @@ import shared.Sizes 1.0
RowLayout {
id: root
- property var seat
+ property real seat
Label {
- readonly property int integers: root.seat ? Math.floor(root.seat.localizedValue) : 0
- readonly property int decimals: root.seat ? (root.seat.localizedValue - Math.floor(root.seat.localizedValue)) * 10 : 0
+ readonly property int integers: root.seat ? Math.floor(root.seat) : 0
+ readonly property int decimals: root.seat ? (root.seat - Math.floor(root.seat)) * 10 : 0
Layout.fillHeight: true
textFormat: Text.RichText
@@ -62,7 +62,7 @@ RowLayout {
Layout.topMargin: Sizes.dp(15)
text: {
if (root.seat) {
- return root.seat.measurementSystem === Locale.MetricSystem ? "°C" : "°F";
+ return Qt.locale().measurementSystem === Locale.MetricSystem ? "°C" : "°F";
} else {
return "";
}
diff --git a/apps/com.pelagicore.climate/controls/TemperatureLabel.qml b/apps/com.pelagicore.climate/controls/TemperatureLabel.qml
index 3ef19218..bd4fe1b4 100644
--- a/apps/com.pelagicore.climate/controls/TemperatureLabel.qml
+++ b/apps/com.pelagicore.climate/controls/TemperatureLabel.qml
@@ -39,11 +39,11 @@ import shared.Style 1.0
import shared.Sizes 1.0
Label {
- property var seat
+ property string seat
horizontalAlignment: Text.AlignHCenter
font.pixelSize: Sizes.fontSizeXL
font.weight: Font.DemiBold
opacity: Style.opacityMedium
// Not showing the measurement unit is the fashionable thing to do
- text: seat ? seat.valueString + "°" : ""
+ text: seat ? seat + "°" : ""
}
diff --git a/apps/com.pelagicore.climate/controls/TemperatureSlider.qml b/apps/com.pelagicore.climate/controls/TemperatureSlider.qml
index 06212182..a92303ca 100644
--- a/apps/com.pelagicore.climate/controls/TemperatureSlider.qml
+++ b/apps/com.pelagicore.climate/controls/TemperatureSlider.qml
@@ -39,12 +39,21 @@ import shared.Sizes 1.0
Slider {
id: root
- width: Sizes.dp(180)
+ readonly property real handleHeight: handle.height
+ signal sliderReleased()
+
+ Connections {
+ target: root
+ function onPressedChanged() {
+ if (!root.pressed)
+ root.sliderReleased()
+ }
+ }
+
+ width: Sizes.dp(180)
orientation: Qt.Vertical
snapMode: Slider.SnapOnRelease
- live: false
+ live: true
stepSize: 0.5
-
- readonly property real handleHeight: handle.height
}
diff --git a/apps/com.pelagicore.climate/info.yaml b/apps/com.pelagicore.climate/info.yaml
index 20f2ad52..d93fd03e 100644
--- a/apps/com.pelagicore.climate/info.yaml
+++ b/apps/com.pelagicore.climate/info.yaml
@@ -1,13 +1,15 @@
formatVersion: 1
-formatType: am-application
+formatType: am-package
---
id: 'com.pelagicore.climate'
icon: 'icon.png'
-code: 'Main.qml'
-runtime: 'qml'
name:
en: 'Climate'
de: 'Klima'
-applicationProperties: { private: { squishPort: 7722 } }
+applications:
+ - id: 'com.pelagicore.climate'
+ code: 'Main.qml'
+ runtime: 'qml'
+ applicationProperties: { private: { squishPort: 7722 } }
categories: [ 'bottombar' ]
diff --git a/apps/com.pelagicore.climate/panels/+lucee/ClimateIndicatorPanel.qml b/apps/com.pelagicore.climate/panels/+lucee/ClimateIndicatorPanel.qml
index 5fae233f..909e844f 100644
--- a/apps/com.pelagicore.climate/panels/+lucee/ClimateIndicatorPanel.qml
+++ b/apps/com.pelagicore.climate/panels/+lucee/ClimateIndicatorPanel.qml
@@ -36,27 +36,27 @@ import QtQuick.Layouts 1.3
import "../controls" 1.0
import "../helpers" 1.0
+import shared.utils 1.0
import shared.Style 1.0
import shared.Sizes 1.0
-Item {
+RowLayout {
id: root
property var store
- width: parent.width
+ width: Sizes.dp(Config.centerConsoleWidth)
height: Sizes.dp(80)
+ LayoutMirroring.enabled: false
TemperatureLabel {
- anchors.left: parent.left
- anchors.verticalCenter: parent.verticalCenter
- anchors.leftMargin: Sizes.dp(44)
- seat: root.store ? root.store.leftSeat : null
+ Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
+ Layout.leftMargin: Sizes.dp(44)
+ seat: root.store ? root.store.leftSeat.localizedValue : null
}
TemperatureLabel {
- anchors.right: parent.right
- anchors.verticalCenter: parent.verticalCenter
- anchors.rightMargin: Sizes.dp(44)
- seat: root.store ? root.store.rightSeat : null
+ Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
+ Layout.rightMargin: Sizes.dp(44)
+ seat: root.store ? root.store.rightSeat.localizedValue : null
}
}
diff --git a/apps/com.pelagicore.climate/panels/ClimateContentPanel.qml b/apps/com.pelagicore.climate/panels/ClimateContentPanel.qml
index 2d1b5090..e7ab2def 100644
--- a/apps/com.pelagicore.climate/panels/ClimateContentPanel.qml
+++ b/apps/com.pelagicore.climate/panels/ClimateContentPanel.qml
@@ -45,8 +45,6 @@ Item {
property var store
property bool seatTemperaturesLinked
- anchors.fill: parent
-
onSeatTemperaturesLinkedChanged: {
if (seatTemperaturesLinked) {
root.store.rightSeat.setValue(root.store.leftSeat.value);
@@ -76,8 +74,9 @@ Item {
anchors.left: parent.left
anchors.right: parent.right
height: Sizes.dp(278)
- leftSeat: root.store ? root.store.leftSeat : null
- rightSeat: root.store ? root.store.rightSeat : null
+ leftSeat: root.store ? root.store.calculateUnitValue(leftTempSlider.value) : null
+ rightSeat: root.store ? root.store.calculateUnitValue(rightTempSlider.value) : null
+
zoneSynchronizationEnabled: root.seatTemperaturesLinked
onDriverSeatTemperatureIncreased: {
if (root.store.leftSeat.value < root.store.leftSeat.maxValue) {
@@ -141,12 +140,14 @@ Item {
anchors.topMargin: Sizes.dp(130) - leftTempSlider.handleHeight/2
anchors.left: parent.left
height: Sizes.dp(1200)
- onMoved: store.leftSeat.setValue(value);
+ onSliderReleased: {
+ root.store.leftSeat.setValue(value);
+ }
}
Connections {
target: root.store ? root.store.leftSeat : null
- onValueChanged: {
+ function onValueChanged() {
if (!leftTempSlider.pressed) {
leftTempSlider.value = target.value
}
@@ -163,12 +164,14 @@ Item {
anchors.topMargin: Sizes.dp(130) - rightTempSlider.handleHeight/2
anchors.right: parent.right
height: Sizes.dp(1200)
- onMoved: root.store.rightSeat.setValue(value);
+ onSliderReleased: {
+ root.store.rightSeat.setValue(value);
+ }
}
Connections {
target: root.store ? root.store.rightSeat : null
- onValueChanged: {
+ function onValueChanged() {
if (!rightTempSlider.pressed) {
rightTempSlider.value = target.value
}
diff --git a/apps/com.pelagicore.climate/panels/ClimateIndicatorPanel.qml b/apps/com.pelagicore.climate/panels/ClimateIndicatorPanel.qml
index 7bd08a49..96337143 100644
--- a/apps/com.pelagicore.climate/panels/ClimateIndicatorPanel.qml
+++ b/apps/com.pelagicore.climate/panels/ClimateIndicatorPanel.qml
@@ -58,7 +58,7 @@ RowLayout {
TemperatureLabel {
Layout.leftMargin: Sizes.dp(36)
Layout.rightMargin: Sizes.dp(36)
- seat: root.store ? root.store.leftSeat : null
+ seat: root.store ? root.store.leftSeat.localizedValue : null
}
Image {
Layout.preferredWidth: Sizes.dp(sourceSize.width)
@@ -77,7 +77,7 @@ RowLayout {
TemperatureLabel {
Layout.leftMargin: Sizes.dp(36)
Layout.rightMargin: Sizes.dp(36)
- seat: root.store ? root.store.rightSeat : null
+ seat: root.store ? root.store.rightSeat.localizedValue : null
}
Image {
Layout.preferredWidth: Sizes.dp(sourceSize.width)
diff --git a/apps/com.pelagicore.climate/popups/ClimatePopup.qml b/apps/com.pelagicore.climate/popups/ClimatePopup.qml
index 84fb96b9..a18d5faf 100644
--- a/apps/com.pelagicore.climate/popups/ClimatePopup.qml
+++ b/apps/com.pelagicore.climate/popups/ClimatePopup.qml
@@ -50,11 +50,9 @@ PopupWindow {
LayoutMirroring.enabled: false
LayoutMirroring.childrenInherit: true
- width: Sizes.dp(910)
- height: Sizes.dp(1426)
-
ClimateContentPanel {
- anchors.fill: parent
+ width: root.width
+ height: root.height
store: root.store
seatTemperaturesLinked: root.seatTemperaturesLinked
}
diff --git a/apps/com.pelagicore.climate/stores/ClimateStore.qml b/apps/com.pelagicore.climate/stores/ClimateStore.qml
index 4e6e2d43..7948a391 100644
--- a/apps/com.pelagicore.climate/stores/ClimateStore.qml
+++ b/apps/com.pelagicore.climate/stores/ClimateStore.qml
@@ -195,7 +195,7 @@ QtObject {
property var conns: Connections {
target: climateControl
- onAirflowDirectionsChanged: airflow.updateProperties()
+ function onAirflowDirectionsChanged() { airflow.updateProperties() }
}
function updateProperties() {
@@ -214,6 +214,6 @@ QtObject {
function calculateUnitValue(value) {
// Default value is the celsius
return root.measurementSystem === Locale.MetricSystem || root.measurementSystem === Locale.ImperialUKSystem ?
- value : Math.round(value * 1.8 + 32)
+ value.toFixed(1) : (value * 1.8 + 32).toFixed(1)
}
}
diff --git a/apps/com.pelagicore.climate/views/ClimateView.qml b/apps/com.pelagicore.climate/views/ClimateView.qml
index 0fafeeec..75aadfc6 100644
--- a/apps/com.pelagicore.climate/views/ClimateView.qml
+++ b/apps/com.pelagicore.climate/views/ClimateView.qml
@@ -48,31 +48,40 @@ Item {
property ClimateStore store
+ ClimateIndicatorPanel {
+ id: indicatorPanel
+ store: root.store
+ anchors.centerIn: parent
+ }
+
ToolButton {
- id: climateToolButton
objectName: "climateAreaMouseArea"
- implicitWidth: (contentItem.childrenRect.width + Sizes.dp(40))
- implicitHeight: parent.height
- anchors.centerIn: parent
- contentItem: ClimateIndicatorPanel {
- store: root.store
- }
+ anchors.fill: indicatorPanel
onClicked: {
climatePopup.store = root.store;
+
+ climatePopup.width = Qt.binding(() => Sizes.dp(910));
+ climatePopup.height = Qt.binding(() => Sizes.dp(1426));
+
+ climatePopup.originItemX = Qt.binding(() => {
+ return Sizes.dp(Config.centerConsoleWidth / 2);
+ });
+ climatePopup.originItemY = Qt.binding(() => {
+ return Sizes.dp(Config.centerConsoleHeight) - Math.round(root.height / 2);
+ });
+ climatePopup.popupY = Qt.binding(() => {
+ return Sizes.dp(Config.centerConsoleHeight) - climatePopup.height - Sizes.dp(90);
+ });
+
climatePopup.visible = true;
}
}
-
ClimatePopup {
id: climatePopup
// have to forward scale from root item as ClimatePopup is a Window, not an Item,
// so value propagation doesn't quite apply
Sizes.scale: root.Sizes.scale
-
- originItemX: Sizes.dp(Config.centerConsoleWidth / 2);
- originItemY: Sizes.dp(Config.centerConsoleHeight) - Math.round(root.height / 2);
- popupY: Sizes.dp(Config.centerConsoleHeight) - climatePopup.height - Sizes.dp(90);
}
}
diff --git a/apps/com.pelagicore.downloads/Main.qml b/apps/com.pelagicore.downloads/Main.qml
index 74c63c9a..edc18111 100644
--- a/apps/com.pelagicore.downloads/Main.qml
+++ b/apps/com.pelagicore.downloads/Main.qml
@@ -57,6 +57,6 @@ ApplicationCCWindow {
y: root.exposedRect.y
width: root.exposedRect.width
height: root.exposedRect.height
- store: DownloadsStore { }
+ store: DownloadsStore { onRequestRaiseAppReceived: root.riseWindow(); }
}
}
diff --git a/apps/com.pelagicore.downloads/controls/DownloadAppList.qml b/apps/com.pelagicore.downloads/controls/DownloadAppList.qml
index 30c37003..a1f46251 100644
--- a/apps/com.pelagicore.downloads/controls/DownloadAppList.qml
+++ b/apps/com.pelagicore.downloads/controls/DownloadAppList.qml
@@ -41,44 +41,76 @@ import shared.Sizes 1.0
ListView {
id: root
- property var store
+ property string appServerUrl
+ property string cpuArch
+ property var applicationModel
+ property real currentInstallationProgress
- signal toolClicked(string appId, string appName)
+ signal toolClicked(string appId, string appName, string purchaseId, string iconUrl)
+ signal appClicked(string appId)
- model: root.store.applicationModel
+ function refreshAppsInfo(isPackageInstalledByPackageControllerFunc,
+ isPackageBuiltInFunc, getInstalledPackageSizeTextFunc) {
+ d.installedPackagesChanged(isPackageInstalledByPackageControllerFunc,
+ isPackageBuiltInFunc, getInstalledPackageSizeTextFunc);
+ }
+
+ QtObject {
+ id: d
+
+ signal installedPackagesChanged(var isPackageInstalledByPackageControllerFunc,
+ var isPackageBuiltInFunc,
+ var getInstalledPackageSizeTextFunc)
+ }
+
+ model: root.applicationModel
currentIndex: -1
delegate: ListItemProgress {
id: delegatedItem
objectName: "itemDownloadApp_" + model.id
- property bool isInstalled: root.store.isInstalled(model.id)
- width: Sizes.dp(675)
- height: Sizes.dp(100)
- icon.source: root.store.appServerUrl + "/app/icon?id=" + model.id
+ property bool isInstalled: model.isInstalled
+ property string packageSizeText: model.packageSizeText
+ property bool packageBuiltIn: model.packageBuiltIn
+
+ width: Sizes.dp(720); height: Sizes.dp(100)
+ icon.source: model.iconUrl
text: model.name
subText: model.id
- secondaryText: delegatedItem.isInstalled ? root.store.getInstalledApplicationSize(model.id)
- : ""
+ secondaryText: delegatedItem.isInstalled ? delegatedItem.packageSizeText
+ : ( delegatedItem.packageBuiltIn ?
+ qsTr("update") : "" )
cancelSymbol: delegatedItem.isInstalled ? "ic-close" : "ic-download_OFF"
- value: root.store.currentInstallationProgress
+ value: root.currentInstallationProgress
onValueChanged: {
if (value === 1.0) {
root.currentIndex = -1;
}
}
- progressVisible: root.currentIndex === index && root.store.currentInstallationProgress < 1.0
+ progressVisible: root.currentIndex === index && root.currentInstallationProgress < 1.0
onProgressCanceled: {
if (!delegatedItem.isInstalled) {
root.currentIndex = index;
}
- root.toolClicked(model.id, model.name);
+ root.toolClicked(model.id, model.name, model.purchaseId, model.iconUrl);
}
+ onClicked: root.appClicked(model.id)
+
Connections {
- target: root.store
- onInstalledAppsChanged: {
- isInstalled = root.store.isInstalled(model.id)
+ target: d
+ function onInstalledPackagesChanged(isPackageInstalledByPackageControllerFunc,
+ isPackageBuiltInFunc,
+ getInstalledPackageSizeTextFunc) {
+ // functions are passed as parameters to signal
+ model.isInstalled = isPackageInstalledByPackageControllerFunc(model.id);
+ if (isInstalled) {
+ model.packageBuiltIn = isPackageBuiltInFunc(model.id);
+ model.packageSizeText = getInstalledPackageSizeTextFunc(model.id);
+ } else {
+ model.packageBuiltIn = false;
+ model.packageSizeText = "";
+ }
}
}
-
}
}
diff --git a/apps/com.pelagicore.downloads/controls/DownloadsToolsColumn.qml b/apps/com.pelagicore.downloads/controls/DownloadsToolsColumn.qml
index 0a6155f9..65ab16c3 100644
--- a/apps/com.pelagicore.downloads/controls/DownloadsToolsColumn.qml
+++ b/apps/com.pelagicore.downloads/controls/DownloadsToolsColumn.qml
@@ -34,38 +34,62 @@ import QtQuick 2.10
import QtQuick.Controls 2.3
import shared.utils 1.0
import shared.Sizes 1.0
-import QtQuick.Controls 2.2
-import QtQuick.Layouts 1.2
-// FIXME: Delete this in favor of ToolsColumn from controls module
-ColumnLayout {
+import shared.controls 1.0
+
+Item {
id: root
- property alias model: toolsRepeater.model
- property int currentIndex: 0
+ property alias model: toolsColumn.model
property string serverUrl
+
signal toolClicked(int index)
+ signal refresh()
- ButtonGroup { id: buttonGroup }
+ BusyIndicator {
+ id: busyIndicator
+
+ running: false
+ anchors.horizontalCenter: root.horizontalCenter
+ opacity: 0.0;
+ visible: opacity > 0.0
+ width: Sizes.dp(100); height: width
+ }
- Repeater {
- id: toolsRepeater
- Layout.alignment: Qt.AlignHCenter
+ ToolsColumn {
+ id: toolsColumn
- ToolButton {
- objectName: "downloadAppViewButton_" + (model.name ? model.name : "unknown")
- Layout.alignment: Qt.AlignHCenter
- baselineOffset: 0
- checkable: true
- checked: root.currentIndex === index
- icon.source: root.serverUrl + "/category/icon?id=" + model.id
- display: AbstractButton.TextUnderIcon
- text: qsTr(model.name)
- font.pixelSize: Sizes.fontSizeXS
- onClicked: {
- root.toolClicked(index);
+ property bool refreshRequired: false
+
+ interactive: true
+ width: Sizes.dp(264)
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.top: parent.top
+ anchors.topMargin: Sizes.dp(53)
+ onClicked: root.toolClicked(currentIndex)
+ onContentYChanged: {
+ if (atYBeginning) {
+ var d = Math.abs(contentY);
+ busyIndicator.opacity = d / busyIndicator.height;
+ if (d > busyIndicator.height) {
+ if (!busyIndicator.running) {
+ busyIndicator.running = true;
+ refreshRequired = true;
+ }
+ } else {
+ busyIndicator.running = false;
+ // if we drag back - no refresh
+ if (dragging)
+ refreshRequired = false;
+ }
+ }
+ }
+ onMovementEnded: {
+ busyIndicator.opacity = 0.0;
+ if (refreshRequired) {
+ refreshRequired = false;
+ refresh();
}
- ButtonGroup.group: buttonGroup
}
}
}
diff --git a/apps/com.pelagicore.downloads/info.yaml b/apps/com.pelagicore.downloads/info.yaml
index 48d99863..5872b0d2 100644
--- a/apps/com.pelagicore.downloads/info.yaml
+++ b/apps/com.pelagicore.downloads/info.yaml
@@ -1,14 +1,18 @@
formatVersion: 1
-formatType: am-application
+formatType: am-package
---
id: 'com.pelagicore.downloads'
icon: 'icon.png'
-code: 'Main.qml'
-runtime: 'qml-inprocess'
name:
en: 'Downloads'
de: 'Downloads'
cs: 'Downloads'
-applicationProperties: { private: { squishPort: 7724 } }
+applications:
+ - id: 'com.pelagicore.downloads'
+ code: 'Main.qml'
+ runtime: 'qml-inprocess'
+ applicationProperties: { private: { squishPort: 7724 } }
categories: [ 'downloads' ]
+intents:
+- id: activate-app
diff --git a/apps/com.pelagicore.downloads/stores/DownloadsStates.qml b/apps/com.pelagicore.downloads/stores/DownloadsStates.qml
new file mode 100644
index 00000000..6b558aab
--- /dev/null
+++ b/apps/com.pelagicore.downloads/stores/DownloadsStates.qml
@@ -0,0 +1,317 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.8
+import QtQml.StateMachine 1.0 as DSM
+
+import "JSONBackend.js" as JSONBackend
+import shared.com.pelagicore.systeminfo 1.0
+import shared.utils 1.0
+
+DSM.StateMachine {
+ running: true
+ initialState: networkConnectedState
+
+ property alias noNetwork: noNetworkState
+ property alias networkConnected: networkConnectedState
+ property alias connectingToServer: connectingToServerState
+ property alias connectedError: connectedErrorState
+ property alias connectedToServer: connectedToServerState
+ property alias fetchingApps: fetchingAppsState
+ property alias fetchingCategories: fetchingCategoriesState
+ property alias appsLoaded: appsLoadedState
+ property alias serverOnMaintance: serverOnMaintanceState
+ property alias serverNA: serverNAState
+ property alias loggingIn: loggingInState
+ property alias categoriesLoaded: categoriesLoadedState
+ property alias checkServerError: checkServerErrorState
+
+ property SystemInfo sysinfo
+ property ServerConfig appStoreConfig
+ property JSONModel jsonCategoryModel
+ property JSONModel jsonAppModel
+
+ DSM.State {
+ id: noNetworkState
+
+ DSM.SignalTransition {
+ targetState: networkConnectedState
+ signal: sysinfo.onInternetAccessChanged
+ guard: sysinfo.internetAccess
+ }
+
+ DSM.SignalTransition {
+ targetState: networkConnectedState
+ signal: sysinfo.onConnectedChanged
+ guard: sysinfo.connected
+ }
+ }
+
+ DSM.State {
+ id: networkConnectedState
+
+ initialState: connectingToServerState
+ onEntered: { appStoreConfig.reconnectionAttempt = 0; }
+
+ DSM.SignalTransition {
+ targetState: noNetworkState
+ signal: sysinfo.onConnectedChanged
+ guard: !sysinfo.connected
+ }
+
+ DSM.SignalTransition {
+ targetState: noNetworkState
+ signal: sysinfo.onInternetAccessChanged
+ guard: !sysinfo.internetAccess
+ }
+
+ DSM.State {
+ id: connectingToServerState
+
+ DSM.SignalTransition {
+ targetState: connectedToServerState
+ signal: appStoreConfig.connectionSuccessful
+ }
+ DSM.SignalTransition {
+ targetState: checkServerErrorState
+ signal: appStoreConfig.connectionFailed
+ }
+ DSM.SignalTransition {
+ targetState: serverOnMaintanceState
+ signal: appStoreConfig.serverOnMaintanceState
+ }
+ }
+
+ DSM.State {
+ id: serverOnMaintanceState
+
+ DSM.SignalTransition {
+ targetState: connectingToServerState
+ signal: appStoreConfig.tryConnectToServer
+ }
+ }
+
+ DSM.State {
+ id: checkServerErrorState
+
+ signal noMoreAttempts()
+
+ onEntered: {
+ if (appStoreConfig.reconnectionAttempt < appStoreConfig.maxReconnectCount) {
+ appStoreConfig.reconnectionAttempt += 1;
+ retryTimer.start();
+ } else {
+ noMoreAttempts();
+ }
+ }
+
+ Timer {
+ id: retryTimer
+ interval: 2000
+ onTriggered: {
+ console.warn(Logging.apps, "Neptune 3 UI::DownloadsStates - Retry Connection",
+ appStoreConfig.reconnectionAttempt, "of",
+ appStoreConfig.maxReconnectCount);
+ appStoreConfig.checkServer();
+ }
+ }
+
+ DSM.SignalTransition {
+ targetState: connectingToServerState
+ signal: appStoreConfig.tryConnectToServer
+ }
+
+ DSM.SignalTransition {
+ targetState: serverNAState
+ signal: checkServerErrorState.noMoreAttempts
+ }
+ }
+
+ DSM.State {
+ id: serverNAState
+
+ onEntered: { appStoreConfig.reconnectionAttempt = 0; }
+
+ DSM.SignalTransition {
+ targetState: connectingToServerState
+ signal: appStoreConfig.tryConnectToServer
+ }
+ }
+
+ DSM.State {
+ id: connectedToServerState
+
+ initialState: loggingInState
+ onEntered: { appStoreConfig.reconnectionAttempt = 0; }
+
+ DSM.SignalTransition {
+ targetState: checkServerErrorState
+ signal: appStoreConfig.connectionFailed
+ }
+
+ DSM.State {
+ id: loggingInState
+
+ onEntered: { appStoreConfig.login(); }
+
+ Connections {
+ target: appStoreConfig
+ function onLoginFailed() {
+ connectedErrorState.errorText = qsTr("Login Failed");
+ }
+ }
+
+ DSM.SignalTransition {
+ targetState: connectedErrorState
+ signal: appStoreConfig.loginFailed
+ }
+
+ DSM.SignalTransition {
+ targetState: loggedInState
+ signal: appStoreConfig.loginSuccessful
+ }
+ }
+
+ DSM.State {
+ id: connectedErrorState
+
+ property string errorText: ""
+
+ DSM.SignalTransition {
+ targetState: connectingToServerState
+ signal: appStoreConfig.tryConnectToServer
+ }
+ }
+
+ DSM.State {
+ id: loggedInState
+
+ initialState: fetchingCategoriesState
+
+ DSM.State {
+ id: fetchingCategoriesState
+
+ onEntered: { jsonCategoryModel.refresh(); }
+
+ Connections {
+ target: jsonCategoryModel
+ function onStatusChanged() {
+ if (jsonCategoryModel.status === "error")
+ connectedErrorState.errorText = qsTr("Fetching categories error");
+ }
+ }
+
+ DSM.SignalTransition {
+ targetState: categoriesLoadedState
+ signal: jsonCategoryModel.onStatusChanged
+ guard: jsonCategoryModel.status === "ready"
+ }
+
+ DSM.SignalTransition {
+ targetState: connectedErrorState
+ signal: jsonCategoryModel.onStatusChanged
+ guard: jsonCategoryModel.status === "error"
+ }
+ }
+
+ DSM.State {
+ id: categoriesLoadedState
+
+ onEntered: {
+ if (jsonCategoryModel.count > 0) {
+ jsonAppModel.categoryId = jsonCategoryModel.get(0).id;
+ jsonAppModel.refresh()
+ } else {
+ jsonCategoryModel.emptyCategoriesList()
+ }
+ }
+
+ DSM.SignalTransition {
+ targetState: fetchingAppsState
+ signal: jsonAppModel.onStatusChanged
+ guard: jsonAppModel.status === "loading"
+ }
+
+ DSM.SignalTransition {
+ targetState: appsLoadedState
+ signal: jsonAppModel.onStatusChanged
+ guard: jsonAppModel.status === "ready"
+ }
+
+ DSM.SignalTransition {
+ targetState: appsLoadedState
+ signal: jsonCategoryModel.onEmptyCategoriesList
+ }
+ }
+
+ DSM.State {
+ id: fetchingAppsState
+
+ Connections {
+ target: jsonAppModel
+ function onStatusChanged() {
+ if (jsonAppModel.status === "error")
+ connectedErrorState.errorText = qsTr("Fetching apps error");
+ }
+ }
+
+ DSM.SignalTransition {
+ targetState: appsLoadedState
+ signal: jsonAppModel.onStatusChanged
+ guard: jsonAppModel.status === "ready"
+ }
+
+ DSM.SignalTransition {
+ targetState: connectedErrorState
+ signal: jsonAppModel.onStatusChanged
+ guard: jsonAppModel.status === "error"
+ }
+ }
+
+ DSM.State {
+ id: appsLoadedState
+
+ DSM.SignalTransition {
+ targetState: fetchingAppsState
+ signal: jsonAppModel.onStatusChanged
+ guard: jsonAppModel.status === "loading"
+ }
+
+ DSM.SignalTransition {
+ targetState: fetchingCategoriesState
+ signal: jsonCategoryModel.onStatusChanged
+ guard: jsonCategoryModel.status === "loading"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/apps/com.pelagicore.downloads/stores/DownloadsStore.qml b/apps/com.pelagicore.downloads/stores/DownloadsStore.qml
index a5398d33..4aeb72ec 100644
--- a/apps/com.pelagicore.downloads/stores/DownloadsStore.qml
+++ b/apps/com.pelagicore.downloads/stores/DownloadsStore.qml
@@ -42,17 +42,28 @@ Item {
id: root
property alias applicationModel: appModel
- property alias categoryModel: catModel
+ property alias categoryModel: categoryListModel
property alias appStoreConfig: appStoreConfig
property string appServerUrl: appStoreConfig.serverUrl
- property int categoryid: 0
+ property alias cpuArch: appStoreConfig.cpuArch
property string filter: ""
property real currentInstallationProgress: 0.0
- readonly property var installedApps: ApplicationManager.applicationIds()
- readonly property bool isOnline: appStoreConfig.serverOnline
- readonly property bool isReconnecting: appStoreConfig.isReconnecting
- property bool isBusy: false// appModel.count == 0 && isOnline
+ readonly property var installedPackages: PackageManager.packageIds()
+ readonly property IntentHandler intentHandler: IntentHandler {
+ intentIds: "activate-app"
+ onRequestReceived: {
+ root.requestRaiseAppReceived()
+ request.sendReply({ "done": true })
+ }
+ }
+ property DownloadsStates downloadsStates: DownloadsStates {
+ sysinfo: sysinfo
+ appStoreConfig: appStoreConfig
+ jsonCategoryModel: jsonCategoryModel
+ jsonAppModel: jsonAppModel
+ }
+ signal requestRaiseAppReceived()
function formatBytes(bytes) {
if (bytes < 1024) return qsTr("%1 Bytes").arg(bytes);
@@ -60,55 +71,83 @@ Item {
else return qsTr("%1 GB").arg((bytes / 1073741824).toFixed(2));
}
- function download(id, name) {
- if (isAppBusy(id)) { return }
+ function download(packageId, name, purchaseId, iconUrl) {
+ if (isPackageBusy(packageId)) {
+ console.warn("Package busy... Abort download");
+ return;
+ }
- var url = appStoreConfig.serverUrl + "/app/purchase"
- var data = {"id": id, "device_id" : "00-11-22-33-44-55" }
+ var url = appStoreConfig.serverUrl + "/app/purchase";
+ var data = {"purchaseId": purchaseId, "device_id" : "00-11-22-33-44-55" };
+ var icon = iconUrl
JSONBackend.serverCall(url, data, function(data) {
if (data !== 0) {
if (data.status === "ok") {
- console.log(Logging.apps, "start downloading")
- var icon = root.appServerUrl + "/app/icon?id=" + id
- var installID = ApplicationInstaller.startPackageInstallation("internal-0", data.url);
- ApplicationInstaller.acknowledgePackageInstallation(installID);
+ console.log(Logging.apps, "start downloading");
+ var installID = PackageManager.startPackageInstallation(data.url);
+ PackageManager.acknowledgePackageInstallation(installID);
} else if (data.status === "fail" && data.error === "not-logged-in"){
- console.log(Logging.apps, ":::AppStoreServer::: not logged in")
+ console.warn(Logging.apps, ":::AppStoreServer::: not logged in");
showNotification(qsTr("System is not logged in"), qsTr("System is not logged in"), icon);
} else {
- console.log(Logging.apps, ":::AppStoreServer::: download failed: " + data.error)
+ console.warn(Logging.apps, ":::AppStoreServer::: download failed: " + data.error);
showNotification(qsTr("%1 Download Failed").arg(name), qsTr("%1 download failed").arg(name), icon);
}
+ } else {
+ console.warn(Logging.apps, ":::AppStoreServer::: download failed");
+ showNotification(qsTr("%1 Download Failed").arg(name), qsTr("%1 download failed").arg(name), icon);
}
})
}
- function isAppBusy(appId) {
- var taskIds = ApplicationInstaller.activeTaskIds()
- if (taskIds.includes(appId)) {
- return true
+ function tryStartApp(appId) {
+ var app = ApplicationManager.application(appId);
+ return app && app.start();
+ }
+
+ function isPackageBuiltIn(packageId) {
+ var pkg = PackageManager.package(packageId);
+ return !!pkg && pkg.builtIn;
+ }
+
+ function isPackageBusy(packageId) {
+ var taskIds = PackageManager.activeTaskIds()
+ if (taskIds.includes(packageId)) {
+ return true;
}
+
+ return false;
}
- function isInstalled(appId) {
- return getInstalledApps().includes(appId);
+ function isPackageInstalledByPackageController(packageId) {
+ var pkg = PackageManager.package(packageId);
+ if (pkg && pkg.builtIn) {
+ //only built-in part or have something to remove
+ return pkg.builtInHasRemovableUpdate;
+ }
+
+ return getInstalledPackages().includes(packageId);
}
- function uninstallApplication(id, name) {
- if (isAppBusy(id)) { return }
- var icon = root.appServerUrl + "/app/icon?id=" + id
- ApplicationInstaller.removePackage(id, false /*keepDocuments*/, true /*force*/);
+ function uninstallPackage(packageId, name) {
+ if (isPackageBusy(packageId)) {
+ console.warn("Package busy... Abort uninstall");
+ return;
+ }
+
+ PackageManager.removePackage(packageId, false /*keepDocuments*/, true /*force*/);
}
function selectCategory(index) {
- var category = categoryModel.get(index);
+ var category = categoryListModel.get(index);
if (category) {
- root.categoryid = category.id;
+ jsonAppModel.categoryId = category.id;
} else {
- root.categoryid = 1;
+ jsonAppModel.categoryId = 1;
}
- appModel.refresh();
+
+ jsonAppModel.refresh();
}
function showNotification(summary, body, icon) {
@@ -120,66 +159,123 @@ Item {
notification.show();
}
- function getInstalledApplicationSize(id) {
- return formatBytes(ApplicationInstaller.installedApplicationSize(id));
+ function getInstalledPackageSizeText(packageId) {
+ if (PackageManager.installedPackageSize(packageId) < 0) {
+ if (isPackageBuiltIn(packageId)) {
+ return qsTr("built-in");
+ } else {
+ console.warn("Uknown app package size: -1", packageId);
+ return qsTr("Unknown size");
+ }
+ }
+
+ return formatBytes(PackageManager.installedPackageSize(packageId));
}
- function deviseApplicationId(id) {
+ function getPackageName(packageId) {
// The application name defined in a specific format for Neptune 3. It has a foo.bar.name format
// for the application name. This function will only comply with such format.
- var strArr = id.split('.')
- var firstUpperCaseLetter = strArr[2].charAt(0).toUpperCase();
- var restLetters = strArr[2].substr(1).toLowerCase();
- var appName = firstUpperCaseLetter + restLetters;
+ // Sometimes "name" from the application manager can't be used, because it won't work when
+ // the application is uninstalled as it will return null. hence, the application
+ // name need to be generated from the application id to be shown in the
+ // notification.
+ var appName = packageId;
+ var pkg = PackageManager.package(packageId);
+ if (pkg) {
+ appName = pkg.name;
+ } else {
+ var lastNamePart = packageId.split('.').pop();
+ if (lastNamePart.length > 1) {
+ appName = lastNamePart.charAt(0).toUpperCase() +
+ lastNamePart.slice(1).toLowerCase();
+ }
+ }
+
return appName;
}
- function getInstalledApps() {
- return ApplicationManager.applicationIds();
+ function getInstalledPackages() {
+ return PackageManager.packageIds();
}
Connections {
- target: ApplicationInstaller
+ target: PackageManager
- onTaskProgressChanged: root.currentInstallationProgress = progress
+ function onTaskProgressChanged(taskId, progress) {
+ root.currentInstallationProgress = progress
+ }
+ function onTaskFailed(taskId) {
+ var packageId = PackageManager.taskPackageId(taskId);
+ var icon = PackageManager.package("com.pelagicore.downloads").icon;
+ var pkg = null;
+ var packageName = "";
- onTaskFailed: {
- var appId = ApplicationInstaller.taskApplicationId(taskId);
- var icon = root.appServerUrl + "/app/icon?id=" + appId
- var application = ApplicationManager.application(appId)
- var applicationName = root.deviseApplicationId(appId);
+ if (packageId !== "") {
+ icon = root.appServerUrl
+ + "/app/icon?id=" + packageId
+ + "&architecture=" + root.cpuArch;
+ pkg = PackageManager.package(packageId);
+ packageName = root.getPackageName(packageId);
+ }
- if (application !== null) {
- if (application.state === ApplicationObject.Installed) {
- showNotification(qsTr("%1 Uninstallation Failed").arg(applicationName),
- qsTr("%1 uninstallation failed").arg(applicationName), icon);
+ if (pkg !== null) {
+ if (pkg.state === ApplicationObject.Installed) {
+ showNotification(qsTr("%1 Uninstallation Failed").arg(packageName),
+ qsTr("%1 uninstallation failed").arg(packageName), icon);
}
} else {
- showNotification(qsTr("%1 Installation Failed").arg(applicationName),
- qsTr("%1 installation failed").arg(applicationName), icon);
+ showNotification(qsTr("%1 Installation Failed").arg(packageName),
+ qsTr("%1 installation failed").arg(packageName), icon);
}
+
+ currentInstallationProgress = 0.0;
}
+ function onTaskFinished(taskId) {
+ var packageId = PackageManager.taskPackageId(taskId);
+ var icon = PackageManager.package("com.pelagicore.downloads").icon;
+ var pkg = null;
+ var packageName = "";
- onTaskFinished: {
- var appId = ApplicationInstaller.taskApplicationId(taskId);
- var icon = root.appServerUrl + "/app/icon?id=" + appId;
- var application = ApplicationManager.application(appId);
+ if (packageId !== "") {
+ icon = root.appServerUrl
+ + "/app/icon?id=" + packageId
+ + "&architecture=" + root.cpuArch;
+ pkg = PackageManager.package(packageId);
- // cannot use name module from the application manager, because it won't work when the application
- // is uninstalled as it will return null. hence, the application name need to be generated from the
- // application id to be shown in the notification.
- var applicationName = root.deviseApplicationId(appId);
+ // cannot use name module from the application manager, because it won't work when
+ // the application is uninstalled as it will return null. hence, the application
+ // name need to be generated from the application id to be shown in the
+ // notification.
+ packageName = root.getPackageName(packageId);
+ }
- if (application !== null) {
- if (application.state === ApplicationObject.Installed) {
- showNotification(qsTr("%1 Successfully Installed").arg(applicationName),
- qsTr("%1 successfully installed").arg(applicationName), icon);
+ if (pkg !== null) {
+ if (pkg.builtIn) {
+ // Always installed (updated or not)
+ if (pkg.builtInHasRemovableUpdate) {
+ showNotification(qsTr("%1 Successfully updated").arg(packageName),
+ qsTr("%1 successfully updated").arg(packageName), icon);
+ } else {
+ showNotification(qsTr("%1 Updates successfully Uninstalled")
+ .arg(packageName),
+ qsTr("%1 updates successfully uninstalled")
+ .arg(packageName), icon);
+ }
+ } else {
+ if (pkg.state === ApplicationObject.Installed) {
+ showNotification(qsTr("%1 Successfully Installed").arg(packageName),
+ qsTr("%1 successfully installed").arg(packageName), icon);
+ } else {
+ showNotification(qsTr("%1 Successfully Uninstalled").arg(packageName),
+ qsTr("%1 successfully uninstalled").arg(packageName),
+ icon);
+ }
}
} else {
- showNotification(qsTr("%1 Successfully Uninstalled").arg(applicationName),
- qsTr("%1 successfully uninstalled").arg(applicationName), icon);
+ showNotification(qsTr("%1 Successfully Uninstalled").arg(packageName),
+ qsTr("%1 successfully uninstalled").arg(packageName), icon);
}
- root.installedAppsChanged()
+ root.installedPackagesChanged()
}
}
@@ -198,24 +294,72 @@ Item {
ServerConfig {
id: appStoreConfig
cpuArch: sysinfo.cpu + "-" + sysinfo.kernel
- property bool initialized: false
- onLoginSuccessful: {
- console.log("server login successful")
- if (!initialized) {
- catModel.refresh()
- initialized = true
- }
+ qtVersion: sysinfo.qtVersion
+ }
+
+ ListModel {
+ id: categoryListModel
+ function refresh() {
+ jsonCategoryModel.refresh();
}
}
JSONModel {
- id: catModel
+ id: jsonCategoryModel
+
url: appStoreConfig.serverUrl + "/category/list"
+ onStatusChanged: {
+ if (status === "loading" && categoryListModel.count > 0) {
+ categoryListModel.clear();
+ jsonAppModel.categoryId = 0;
+ }
+
+ if (status === "ready") {
+ categoryListModel.clear();
+ for (let i = 0; i < jsonCategoryModel.count; ++i) {
+ let cat = jsonCategoryModel.get(i);
+ categoryListModel.append({
+ "id": cat.id, "text": cat.name,
+ "sourceOn": root.appServerUrl + "/category/icon?id=" + cat.id,
+ "sourceOff": root.appServerUrl + "/category/icon?id=" + cat.id,
+ });
+ }
+ }
+ }
}
- JSONModel {
+ ListModel {
id: appModel
+ }
+
+ JSONModel {
+ id: jsonAppModel
+
+ property int categoryId: 0
url: appStoreConfig.serverUrl + "/app/list"
- data: root.categoryid >= 0 ? ({ "filter" : root.filter , "category_id" : root.categoryid}) : ({ "filter" : root.filter})
+ data: jsonAppModel.categoryId >= 0 ? ({ "filter" : root.filter ,
+ "category_id" : jsonAppModel.categoryId})
+ : ({ "filter" : root.filter})
+ onStatusChanged: {
+ appModel.clear();
+
+ if (status === "ready") {
+ let appList = [];
+ for (let i = 0; i < jsonAppModel.count; ++i) {
+ let app = jsonAppModel.get(i);
+ let isInstalled = isPackageInstalledByPackageController(app.id)
+ appList.push({
+ "id": app.id,
+ "name": app.name,
+ "isInstalled": isInstalled,
+ "packageSizeText": isInstalled ? getInstalledPackageSizeText(app.id) : "",
+ "packageBuiltIn": isInstalled ? isPackageBuiltIn(app.id) : false,
+ "purchaseId": app.purchaseId,
+ "iconUrl": app.iconUrl
+ });
+ }
+ appModel.append(appList)
+ }
+ }
}
}
diff --git a/apps/com.pelagicore.downloads/stores/JSONBackend.js b/apps/com.pelagicore.downloads/stores/JSONBackend.js
index 129f472c..1aa58ee3 100644
--- a/apps/com.pelagicore.downloads/stores/JSONBackend.js
+++ b/apps/com.pelagicore.downloads/stores/JSONBackend.js
@@ -33,7 +33,6 @@
.pragma library
.import shared.utils 1.0 as Utils
-var request = new XMLHttpRequest()
var errorCounter = 0
var errorFunc = 0
@@ -42,8 +41,8 @@ function setErrorFunction(func) {
errorFunc = func
}
-function serverCall(url, data, dataReadyFunction, xhr) {
- var i = 0
+function serverCall(url, data, dataReadyFunction) {
+ var i = 0;
for (var key in data)
{
if (i === 0) {
@@ -51,40 +50,37 @@ function serverCall(url, data, dataReadyFunction, xhr) {
} else {
url += "&" + key+ "=" + data[key];
}
- i++
+ i++;
}
- // when no xhr is defined use the global one and reuse it
- if (xhr === undefined) {
- xhr = new XMLHttpRequest()
- }
-
- console.log(Utils.Logging.sysui, "HTTP GET to " + url);
- if (xhr.readyState !== 0) {
- xhr.abort();
- }
+ var xhr = new XMLHttpRequest();
+ console.log(Utils.Logging.apps, "HTTP GET to " + url);
xhr.open("GET", url);
xhr.onreadystatechange = function() {
if (xhr.readyState === XMLHttpRequest.DONE) {
-
if (xhr.responseText !== "") {
- errorCounter = 0
- var data = JSON.parse(xhr.responseText);
- return dataReadyFunction(data)
+ errorCounter = 0;
+ var data = 0;
+
+ try {
+ data = JSON.parse(xhr.responseText);
+ } catch(e) {
+ console.warn(Utils.Logging.apps, "JSONBackend error parsing answer:",
+ xhr.responseText);
+ }
+
+ return dataReadyFunction(data);
} else {
- console.log(Utils.Logging.sysui, "JSONBackend: " + xhr.status + xhr.statusText)
- errorCounter++
+ console.warn(Utils.Logging.apps, "JSONBackend: status:", xhr.status,
+ xhr.statusText);
+ errorCounter++;
if (errorCounter >= 3 && errorFunc) {
- errorFunc()
+ errorFunc();
}
- return dataReadyFunction(0)
+ return dataReadyFunction(0);
}
}
}
xhr.send();
}
-
-function abortableServerCall(url, data, dataReadyFunction) {
- serverCall(url,data,dataReadyFunction,request)
-}
diff --git a/apps/com.pelagicore.downloads/stores/JSONModel.qml b/apps/com.pelagicore.downloads/stores/JSONModel.qml
index 542e18da..76d2beea 100644
--- a/apps/com.pelagicore.downloads/stores/JSONModel.qml
+++ b/apps/com.pelagicore.downloads/stores/JSONModel.qml
@@ -43,8 +43,14 @@ ListModel {
function refresh() {
status = "loading"
- clear();
- JSONBackend.abortableServerCall(url, data, function(data) {
+ JSONBackend.serverCall(url, data, function(data) {
+ clear();
+ if (data === 0) {
+ status = "error";
+
+ return;
+ }
+
for (var i = 0; i < data.length; i++) {
var entry = data[i];
append(entry);
diff --git a/apps/com.pelagicore.downloads/stores/ServerConfig.qml b/apps/com.pelagicore.downloads/stores/ServerConfig.qml
index 46c527f4..9df51653 100644
--- a/apps/com.pelagicore.downloads/stores/ServerConfig.qml
+++ b/apps/com.pelagicore.downloads/stores/ServerConfig.qml
@@ -39,88 +39,80 @@ import shared.utils 1.0
QtObject {
id: root
- property bool serverOnline: false
- property string serverReason
property string cpuArch
+ property string qtVersion
property string serverUrl: ApplicationManager.systemProperties.appStoreServerUrl
property string userName: ApplicationManager.systemProperties.userName
property string userPassword: ApplicationManager.systemProperties.userPassword
readonly property string imei: ApplicationManager.systemProperties.imei
- property bool isReconnecting: false
+
+ readonly property int maxReconnectCount: 5
+ property int reconnectionAttempt: 0
signal loginSuccessful()
+ signal connectionSuccessful()
+ signal connectionFailed()
+ signal tryConnectToServer()
+ signal loginFailed()
+ signal serverOnMaintance()
property var d: QtObject {
-
- property int attempt: 0
- property Timer retryTimer: Timer {
- interval: 2000
- onTriggered: {
- d.checkServerPrivate()
- }
- }
-
- function retry() {
- console.log(Logging.apps, "Neptune-UI::Application Store - Retry Connection");
- if (attempt < 5) {
- attempt += 1;
- retryTimer.start();
- } else {
- root.isReconnecting = false;
- }
- }
-
function checkServerPrivate() {
- root.isReconnecting = true;
console.log(Logging.apps, "Neptune-UI::Application Store - Check Server");
+ root.tryConnectToServer();
var url = root.serverUrl + "/hello";
- var data = {"platform" : "NEPTUNE3", "version" : "1", "architecture": root.cpuArch};
- JSONBackend.setErrorFunction(function () {
- root.serverOnline = false;
- root.serverReason = "unknown";
- root.d.retry()
- })
+ var data = {
+ "platform" : "NEPTUNE3",
+ "version" : "2",
+ "architecture": root.cpuArch,
+ "require_tag" :
+ "build_target:" + (WindowManager.runningOnDesktop ? "desktop" : "embedded")
+ + ",qt:" + root.qtVersion
+ };
+ JSONBackend.setErrorFunction(0);
JSONBackend.serverCall(url, data, function(data) {
if (data !== 0) {
if (data.status === "ok") {
- root.d.attempt = 0
- root.serverOnline = true;
- root.isReconnecting = false;
- root.login();
+ root.reconnectionAttempt = 0
+ root.connectionSuccessful();
} else if (data.status === "maintenance") {
- console.log(Logging.apps, "Server Call: maintenance");
- root.serverOnline = false;
- root.serverReason = "maintenance";
+ console.warn(Logging.apps, "Server Call: maintenance");
+ root.serverOnMaintance();
} else {
- console.log(Logging.apps, "Server Call Err: " + data.error);
- root.serverOnline = false;
- root.d.retry()
+ console.warn(Logging.apps, "Server Call Err: " + data.error,
+ "Status: " + data.status);
+ root.connectionFailed();
}
} else {
- root.serverOnline = false;
- root.serverReason = "unknown";
- root.d.retry();
+ console.warn(Logging.apps, "Server Check Error: zero data error")
+ root.connectionFailed();
}
})
}
}
function checkServer() {
- root.d.attempt = 0
root.d.checkServerPrivate()
}
function login() {
var url = serverUrl + "/login"
var data = { "username" : userName, "password" : userPassword, "imei" : imei }
+
+ JSONBackend.setErrorFunction(0);
JSONBackend.serverCall(url, data, function(data) {
if (data !== 0) {
if (data.status === "ok") {
console.log(Logging.apps, "Login Succeeded");
loginSuccessful();
} else {
- console.log(Logging.apps, "Login Err: " + data.error);
+ console.warn(Logging.apps, "Login Error: " + data.error,
+ "Status: " + data.status);
+ root.loginFailed();
}
+ } else {
+ console.warn(Logging.apps, "Login Error: zero data error");
+ root.loginFailed();
}
})
}
diff --git a/apps/com.pelagicore.downloads/views/DownloadsView.qml b/apps/com.pelagicore.downloads/views/DownloadsView.qml
index 327a8f0e..f2f69398 100644
--- a/apps/com.pelagicore.downloads/views/DownloadsView.qml
+++ b/apps/com.pelagicore.downloads/views/DownloadsView.qml
@@ -46,134 +46,299 @@ Item {
property DownloadsStore store
- BusyIndicator {
- id: busyIndicator
-
- width: Sizes.dp(225)
- height: Sizes.dp(440)
- anchors.centerIn: parent
- running: visible
- opacity: root.store.isBusy ? 1.0 : 0.0
- visible: opacity > 0.0
- Behavior on opacity {
- PauseAnimation { duration: 1000 }
- DefaultNumberAnimation { }
- }
-
- onRunningChanged: {
- if (!running) { // preselect non-empty category
- toolsColumn.toolClicked(0);
+ states: [
+ State {
+ when: store.downloadsStates.noNetwork.active
+ PropertyChanges { target: busyMessage; opacity: 1.0 }
+ PropertyChanges { target: downloadsContent; opacity: 0.0 }
+ PropertyChanges {
+ target: busyIndicator
+ opacity: store.downloadsStates.connectingToServer.active ? 1.0 : 0.0
}
- }
- }
-
- Loader {
- anchors.top: root.store.isBusy ? busyIndicator.bottom : undefined
- anchors.centerIn: busyIndicator.visible ? undefined : root
- anchors.topMargin: Sizes.dp(8)
- anchors.horizontalCenter: parent.horizontalCenter
- sourceComponent: root.store.isOnline ? fetchingLabel : noInternetLabel
- visible: opacity > 0
- opacity: root.store.isOnline ? busyIndicator.opacity : 1.0
- Behavior on opacity { DefaultNumberAnimation { } }
- }
-
- Component {
- id: fetchingLabel
-
- Label {
- color: Style.contrastColor
- font.pixelSize: Sizes.fontSizeM
- text: qsTr("Fetching data from Neptune Server")
- }
- }
-
- Component {
- id: noInternetLabel
-
- Column {
- id: column
- anchors.centerIn: parent
- spacing: Sizes.dp(50)
- Label {
- color: Style.contrastColor
- font.pixelSize: Sizes.fontSizeM
- horizontalAlignment: Text.AlignHCenter
+ PropertyChanges {
+ target: topMessageText
text: qsTr("Cannot Connect to the Server") + "\n" +
qsTr("A Network connection is required")
}
- Label {
- color: Style.contrastColor
- font.pixelSize: Sizes.fontSizeM
- horizontalAlignment: Text.AlignHCenter
+ PropertyChanges {
+ target: bottomMessageText
text: qsTr("Reconnecting...")
- visible: store.isReconnecting
- anchors.horizontalCenter: parent.horizontalCenter
+ opacity: store.downloadsStates.connectingToServer.active ? 1.0 : 0.0
}
- Button {
- text: qsTr("Retry")
- implicitHeight: Sizes.dp(70)
- implicitWidth: Sizes.dp(315)
- font.pixelSize: Sizes.fontSizeS
- anchors.horizontalCenter: column.horizontalCenter
- visible: !store.isReconnecting
- onClicked: {
- store.appStoreConfig.checkServer()
- }
+ PropertyChanges {
+ target: retryButton
+ visible: !store.downloadsStates.connectingToServer.active
+ }
+ },
+ State {
+ when: store.downloadsStates.networkConnected.active
+ && store.downloadsStates.connectingToServer.active
+ PropertyChanges { target: busyMessage; opacity: 1.0 }
+ PropertyChanges { target: downloadsContent; opacity: 0.0 }
+ PropertyChanges { target: busyIndicator; opacity: 1.0 }
+ PropertyChanges {
+ target: topMessageText
+ text: qsTr("Connecting to server...")
+ }
+ PropertyChanges { target: bottomMessageText; opacity: 0.0 }
+ PropertyChanges { target: retryButton; visible: false }
+ },
+ State {
+ when: store.downloadsStates.networkConnected.active
+ && store.downloadsStates.checkServerError.active
+ PropertyChanges { target: busyMessage; opacity: 1.0 }
+ PropertyChanges { target: downloadsContent; opacity: 0.0 }
+ PropertyChanges { target: busyIndicator; opacity: 1.0 }
+ PropertyChanges {
+ target: topMessageText
+ text: qsTr("Connecting to server...")
+ }
+ PropertyChanges { target: bottomMessageText; opacity: 0.0 }
+ PropertyChanges { target: retryButton; visible: false }
+ },
+ State {
+ when: store.downloadsStates.serverNA.active
+ PropertyChanges { target: busyMessage; opacity: 1.0 }
+ PropertyChanges { target: downloadsContent; opacity: 0.0 }
+ PropertyChanges { target: busyIndicator; opacity: 0.0 }
+ PropertyChanges {
+ target: topMessageText
+ text: qsTr("Server is not available")
}
+ PropertyChanges { target: retryButton; visible: true }
+ },
+ State {
+ when: store.downloadsStates.serverOnMaintance.active
+ PropertyChanges { target: busyMessage; opacity: 1.0 }
+ PropertyChanges { target: downloadsContent; opacity: 0.0 }
+ PropertyChanges { target: busyIndicator; opacity: 0.0 }
+ PropertyChanges {
+ target: topMessageText
+ text: qsTr("Server is on Maintance")
+ }
+ PropertyChanges { target: retryButton; visible: true }
+ },
+ State {
+ when: store.downloadsStates.connectedError.active
+ PropertyChanges { target: busyMessage; opacity: 1.0 }
+ PropertyChanges { target: downloadsContent; opacity: 0.0 }
+ PropertyChanges { target: busyIndicator; opacity: 0.0 }
+ PropertyChanges {
+ target: topMessageText
+ text: store.downloadsStates.connectedError.errorText
+ }
+ PropertyChanges { target: retryButton; visible: true }
+ },
+ State {
+ when: store.downloadsStates.fetchingApps.active
+ || store.downloadsStates.fetchingCategories.active
+ PropertyChanges { target: busyMessage; opacity: 1.0 }
+ PropertyChanges { target: downloadsContent; opacity: 1.0 }
+ PropertyChanges { target: appList; opacity: 0.0 }
+ PropertyChanges { target: busyIndicator; opacity: 1.0 }
+ PropertyChanges {
+ target: topMessageText
+ text: qsTr("Fetching data from Neptune Server")
+ }
+ PropertyChanges { target: bottomMessageText; text: "" }
+ PropertyChanges { target: retryButton; visible: false }
+ },
+ State {
+ when: store.downloadsStates.appsLoaded.active && appList.count === 0
+ PropertyChanges { target: busyMessage; opacity: 1.0 }
+ PropertyChanges { target: downloadsContent; opacity: 1.0 }
+ PropertyChanges { target: busyIndicator; opacity: 0.0 }
+ PropertyChanges {
+ target: topMessageText
+ text: qsTr("No apps")
+ }
+ PropertyChanges { target: bottomMessageText; text: "" }
+ PropertyChanges { target: retryButton; visible: false }
+ },
+ State {
+ when: store.downloadsStates.appsLoaded.active && appList.count > 0
+ PropertyChanges { target: busyMessage; opacity: 0.0 }
+ PropertyChanges { target: downloadsContent; opacity: 1.0 }
+ PropertyChanges { target: appList; opacity: 1.0 }
}
- }
-
- Label {
- anchors.centerIn: parent
- color: Style.contrastColor
- font.pixelSize: Sizes.fontSizeM
- text: qsTr("No apps found!")
- opacity: 1.0 - busyIndicator.opacity
- visible: root.store.isBusy
- }
+ ]
RowLayout {
id: downloadsContent
+
anchors.left: parent.left
anchors.top: parent.top
anchors.topMargin: Sizes.dp(500)
anchors.bottom: parent.bottom
anchors.bottomMargin: Sizes.dp(20)
+ opacity: 0.0
visible: opacity > 0
- opacity: root.store.isOnline ? 1.0 : 0.0
- Behavior on opacity { DefaultNumberAnimation { } }
DownloadsToolsColumn {
id: toolsColumn
+
objectName: "downloadsAppColumn"
Layout.preferredWidth: Sizes.dp(264)
- Layout.preferredHeight: Sizes.dp(320)
- Layout.alignment: Qt.AlignTop
+ Layout.fillHeight: true
model: root.store.categoryModel
serverUrl: root.store.appServerUrl
onToolClicked: root.store.selectCategory(index)
+ onRefresh: root.store.categoryModel.refresh()
}
DownloadAppList {
id: appList
+
objectName: "downloadAppList"
Layout.preferredHeight: Sizes.dp(800)
Layout.preferredWidth: Sizes.dp(675)
Layout.alignment: Qt.AlignTop
Layout.topMargin: Sizes.dp(16)
- store: root.store
-
+ appServerUrl: root.store.appServerUrl
+ cpuArch: root.store.cpuArch
+ applicationModel: root.store.applicationModel
+ currentInstallationProgress: root.store.currentInstallationProgress
onToolClicked: {
- if (root.store.isAppBusy(appId)) {
- return
+ if (root.store.isPackageBusy(appId)) {
+ console.warn("Package busy... Aborting", appId)
+ return;
}
- if (root.store.isInstalled(appId)) {
- root.store.uninstallApplication(appId, appName)
+ if (root.store.isPackageInstalledByPackageController(appId)) {
+ root.store.uninstallPackage(appId, appName);
} else {
- root.store.download(appId, appName)
+ root.store.download(appId, appName, purchaseId, iconUrl);
+ }
+ }
+ onAppClicked: { root.store.tryStartApp(appId); }
+
+ Behavior on opacity { DefaultNumberAnimation { duration: 200 } }
+
+ Connections {
+ target: root.store
+ function onInstalledPackagesChanged() {
+ // update states of app items, pass functions to update function
+ appList.refreshAppsInfo(root.store.isPackageInstalledByPackageController,
+ root.store.isPackageBuiltIn,
+ root.store.getInstalledPackageSizeText)
}
}
}
}
+
+ Item {
+ id: busyMessage
+
+ anchors.fill: parent
+ Behavior on opacity {
+ SequentialAnimation{
+ // keep invisible and only show if nothing happens not to blink
+ PauseAnimation { duration: 400 }
+ DefaultNumberAnimation { }
+ }
+ }
+
+ ColumnLayout {
+ anchors.top: parent.top
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.topMargin: Sizes.dp(400)
+
+ BusyIndicator {
+ id: busyIndicator
+
+ implicitWidth: Sizes.dp(225)
+ implicitHeight: Sizes.dp(440)
+ opacity: 0.0
+ Layout.alignment: Qt.AlignHCenter
+ Behavior on opacity {
+ SequentialAnimation{
+ PauseAnimation { duration: 1000 }
+ DefaultNumberAnimation { }
+ }
+ }
+ }
+
+ Label {
+ id: topMessageText
+
+ color: Style.contrastColor
+ font.pixelSize: Sizes.fontSizeM
+ horizontalAlignment: Text.AlignHCenter
+ Layout.alignment: Qt.AlignHCenter
+ }
+
+ Label {
+ id: bottomMessageText
+
+ color: Style.contrastColor
+ font.pixelSize: Sizes.fontSizeM
+ horizontalAlignment: Text.AlignHCenter
+ Layout.alignment: Qt.AlignHCenter
+ }
+
+ Button {
+ id: retryButton
+
+ text: qsTr("Retry")
+ implicitHeight: Sizes.dp(70)
+ implicitWidth: Sizes.dp(315)
+ font.pixelSize: Sizes.fontSizeS
+ visible: false
+ Layout.alignment: Qt.AlignHCenter
+ onClicked: { store.appStoreConfig.checkServer() }
+ }
+ }
+ }
+
+ /*
+
+ // Debug visual output for states changes
+
+ Loader {
+ active: true
+ sourceComponent: Component {
+ id: debugStatesComponent
+
+ ListView {
+ width: parent.width; height: Sizes.dp(600)
+ model: statesModel
+ delegate: Row {
+ Rectangle {
+ width: Sizes.dp(20); height: Sizes.dp(30);
+ color: model.stateValue ? "green" : "red"
+ }
+ Label { text: model.stateName }
+ }
+
+ function updateStatesList() {
+ statesModel.clear();
+ statesModel.append({"stateName": "noNetwork", "stateValue": store.downloadsStates.noNetwork.active });
+ statesModel.append({"stateName": "networkConnected", "stateValue": store.downloadsStates.networkConnected.active });
+ statesModel.append({"stateName": "connectingToServer", "stateValue": store.downloadsStates.connectingToServer.active });
+ statesModel.append({"stateName": "connectedError", "stateValue": store.downloadsStates.connectedError.active });
+ statesModel.append({"stateName": "connectedToServer", "stateValue": store.downloadsStates.connectedToServer.active });
+ statesModel.append({"stateName": "fetchingApps", "stateValue": store.downloadsStates.fetchingApps.active });
+ statesModel.append({"stateName": "fetchingCategories", "stateValue": store.downloadsStates.fetchingCategories.active });
+ statesModel.append({"stateName": "appsLoaded", "stateValue": store.downloadsStates.appsLoaded.active });
+ statesModel.append({"stateName": "serverOnMaintance", "stateValue": store.downloadsStates.serverOnMaintance.active });
+ statesModel.append({"stateName": "serverNA", "stateValue": store.downloadsStates.serverNA.active });
+ statesModel.append({"stateName": "loggingIn", "stateValue": store.downloadsStates.loggingIn.active });
+ statesModel.append({"stateName": "categoriesLoaded", "stateValue": store.downloadsStates.categoriesLoaded.active });
+ statesModel.append({"stateName": "checkServerError", "stateValue": store.downloadsStates.checkServerError.active });
+ }
+
+ ListModel {
+ id: statesModel
+ Component.onCompleted: { updateStatesList(); }
+ }
+
+ Connections {
+ target: root
+ function onStateChanged() { updateStatesList(); }
+ }
+ }
+
+ }
+ }
+
+ */
}
diff --git a/apps/com.pelagicore.hud/Main.qml b/apps/com.pelagicore.hud/Main.qml
index 078a8c7c..8d66150e 100644
--- a/apps/com.pelagicore.hud/Main.qml
+++ b/apps/com.pelagicore.hud/Main.qml
@@ -33,10 +33,9 @@
import QtQuick 2.8
import QtQuick.Controls 2.2
import application.windows 1.0
-import shared.com.pelagicore.remotesettings 1.0
-import shared.com.pelagicore.drivedata 1.0
-import shared.Style 1.0
import shared.Sizes 1.0
+import "stores"
+import "views"
NeptuneWindow {
id: root
@@ -44,90 +43,12 @@ NeptuneWindow {
width: Sizes.dp(480)
height: Sizes.dp(240)
- property real currentSpeed: clusterSettings.speed
- property real speedLimit: clusterSettings.speedLimit
- property real cruiseSpeed: clusterSettings.speedCruise
-
Component.onCompleted: {
setWindowProperty("windowType", "hud");
}
- InstrumentCluster {
- id: clusterSettings
- }
-
- Item {
+ MainView {
anchors.fill: parent
-
- Rectangle {
- anchors.centerIn: parent
- anchors.horizontalCenterOffset: - Sizes.dp(80)
- anchors.rightMargin: Sizes.dp(20)
- width: Sizes.dp(50)
- height: Sizes.dp(50)
- radius: width / 2
- border.color: (root.currentSpeed > root.speedLimit) ? "red" : "grey"
- border.width: Sizes.dp(6)
- opacity: (root.currentSpeed > root.speedLimit) ? 1.0 : 0.0
- Behavior on opacity {
- NumberAnimation { easing.type: Easing.OutCubic; duration: 270 }
- }
- Label {
- anchors.centerIn: parent
- text: Math.round(speedLimit)
- opacity: Style.opacityHigh
- font.pixelSize: Sizes.fontSizeXS
- color: root.Style.theme === Style.Dark ? Style.mainColor : Style.contrastColor
- }
- }
-
- Image {
- id: cruiseIcon
- anchors.horizontalCenter: parent.horizontalCenter
- anchors.horizontalCenterOffset: -Sizes.dp(18)
- anchors.bottom: speed.top
- opacity: (root.cruiseSpeed >= 30) ? 1 : 0.0
- width: Sizes.dp(35)
- height: Sizes.dp(31)
- source: "assets/ic-acc.png"
- Behavior on opacity {
- NumberAnimation { easing.type: Easing.OutCubic; duration: 270 }
- }
- }
-
- Label {
- anchors.left: cruiseIcon.right
- anchors.leftMargin: Sizes.dp(10)
- anchors.verticalCenter: cruiseIcon.verticalCenter
- text: Math.round(root.cruiseSpeed)
- font.weight: Font.Light
- font.pixelSize: Sizes.fontSizeS
- opacity: cruiseIcon.opacity
- color: "white"
- }
-
- Label {
- id: speed
- anchors.horizontalCenter: parent.horizontalCenter
- anchors.verticalCenter: parent.verticalCenter
- text: Math.round(root.currentSpeed)
- verticalAlignment: Text.AlignTop
- horizontalAlignment: Text.AlignHCenter
- font.weight: Font.DemiBold
- color: Style.accentColor
- opacity: Style.opacityHigh
- font.pixelSize: Sizes.fontSizeXXL
- }
-
- Label {
- anchors.horizontalCenter: parent.horizontalCenter
- anchors.verticalCenter: parent.verticalCenter
- anchors.horizontalCenterOffset: Sizes.dp(88)
- text: qsTr("km/h")
- font.weight: Font.Light
- color: Style.accentColor
- opacity: Style.opacityLow
- font.pixelSize: Sizes.fontSizeM
- }
+ rootStore: RootStore {}
}
}
diff --git a/apps/com.pelagicore.hud/assets/nav_bear_l-dark.png b/apps/com.pelagicore.hud/assets/nav_bear_l-dark.png
new file mode 100644
index 00000000..d5383c84
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_bear_l-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:da6621b5650fc38d61af05b7b5824d733403a6caed69012124a4c78a541907f0
+size 870
diff --git a/apps/com.pelagicore.hud/assets/nav_bear_l.png b/apps/com.pelagicore.hud/assets/nav_bear_l.png
new file mode 100644
index 00000000..d5383c84
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_bear_l.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:da6621b5650fc38d61af05b7b5824d733403a6caed69012124a4c78a541907f0
+size 870
diff --git a/apps/com.pelagicore.hud/assets/nav_bear_r-dark.png b/apps/com.pelagicore.hud/assets/nav_bear_r-dark.png
new file mode 100644
index 00000000..3ded2531
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_bear_r-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ec067d873d75de30164b07de9d30e139220352754ba07507638300b04d838a02
+size 878
diff --git a/apps/com.pelagicore.hud/assets/nav_bear_r.png b/apps/com.pelagicore.hud/assets/nav_bear_r.png
new file mode 100644
index 00000000..3ded2531
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_bear_r.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ec067d873d75de30164b07de9d30e139220352754ba07507638300b04d838a02
+size 878
diff --git a/apps/com.pelagicore.hud/assets/nav_hard_l-dark.png b/apps/com.pelagicore.hud/assets/nav_hard_l-dark.png
new file mode 100644
index 00000000..2b90181e
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_hard_l-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a226b2b445670415228fcd036121673aac79b0d04b903fe5f848a34d6948130b
+size 1113
diff --git a/apps/com.pelagicore.hud/assets/nav_hard_l.png b/apps/com.pelagicore.hud/assets/nav_hard_l.png
new file mode 100644
index 00000000..2b90181e
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_hard_l.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a226b2b445670415228fcd036121673aac79b0d04b903fe5f848a34d6948130b
+size 1113
diff --git a/apps/com.pelagicore.hud/assets/nav_hard_r-dark.png b/apps/com.pelagicore.hud/assets/nav_hard_r-dark.png
new file mode 100644
index 00000000..51f7365d
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_hard_r-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1eb11f5af439d5ca8f3ac483d9dbeaa37e917ce90ebe789f130fc74df65fb84d
+size 1057
diff --git a/apps/com.pelagicore.hud/assets/nav_hard_r.png b/apps/com.pelagicore.hud/assets/nav_hard_r.png
new file mode 100644
index 00000000..51f7365d
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_hard_r.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1eb11f5af439d5ca8f3ac483d9dbeaa37e917ce90ebe789f130fc74df65fb84d
+size 1057
diff --git a/apps/com.pelagicore.hud/assets/nav_left-dark.png b/apps/com.pelagicore.hud/assets/nav_left-dark.png
new file mode 100644
index 00000000..ce132b37
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_left-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2b178943f15563fdcf9bb4c246308d7981ebff6450f5f8a4f4b8bbc285139348
+size 848
diff --git a/apps/com.pelagicore.hud/assets/nav_left.png b/apps/com.pelagicore.hud/assets/nav_left.png
new file mode 100644
index 00000000..ce132b37
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_left.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2b178943f15563fdcf9bb4c246308d7981ebff6450f5f8a4f4b8bbc285139348
+size 848
diff --git a/apps/com.pelagicore.hud/assets/nav_light_left-dark.png b/apps/com.pelagicore.hud/assets/nav_light_left-dark.png
new file mode 100644
index 00000000..6f30cddf
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_light_left-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:85b7b65fc75cc448610ea57ab618cf4fdd1a36ddef7bb2108def83e27e4b7f9f
+size 1090
diff --git a/apps/com.pelagicore.hud/assets/nav_light_left.png b/apps/com.pelagicore.hud/assets/nav_light_left.png
new file mode 100644
index 00000000..6f30cddf
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_light_left.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:85b7b65fc75cc448610ea57ab618cf4fdd1a36ddef7bb2108def83e27e4b7f9f
+size 1090
diff --git a/apps/com.pelagicore.hud/assets/nav_light_right-dark.png b/apps/com.pelagicore.hud/assets/nav_light_right-dark.png
new file mode 100644
index 00000000..ebc90038
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_light_right-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2be3e5a99c79af84addf4030838a6bfc1d9a141c316bce125f7b9cf2fdaf03da
+size 1113
diff --git a/apps/com.pelagicore.hud/assets/nav_light_right.png b/apps/com.pelagicore.hud/assets/nav_light_right.png
new file mode 100644
index 00000000..ebc90038
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_light_right.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2be3e5a99c79af84addf4030838a6bfc1d9a141c316bce125f7b9cf2fdaf03da
+size 1113
diff --git a/apps/com.pelagicore.hud/assets/nav_right-dark.png b/apps/com.pelagicore.hud/assets/nav_right-dark.png
new file mode 100644
index 00000000..8866c5b7
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_right-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c8eed602798517d3f439512bb3cc281deac2b5387e0573c2da9449727aee0056
+size 799
diff --git a/apps/com.pelagicore.hud/assets/nav_right.png b/apps/com.pelagicore.hud/assets/nav_right.png
new file mode 100644
index 00000000..8866c5b7
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_right.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c8eed602798517d3f439512bb3cc281deac2b5387e0573c2da9449727aee0056
+size 799
diff --git a/apps/com.pelagicore.hud/assets/nav_straight-dark.png b/apps/com.pelagicore.hud/assets/nav_straight-dark.png
new file mode 100644
index 00000000..218c6a76
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_straight-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:694337b302e02615c664884fa0021c448bb45d036df3d42a58b1b9bf947f6400
+size 379
diff --git a/apps/com.pelagicore.hud/assets/nav_straight.png b/apps/com.pelagicore.hud/assets/nav_straight.png
new file mode 100644
index 00000000..218c6a76
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_straight.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:694337b302e02615c664884fa0021c448bb45d036df3d42a58b1b9bf947f6400
+size 379
diff --git a/apps/com.pelagicore.hud/assets/nav_uturn_l-dark.png b/apps/com.pelagicore.hud/assets/nav_uturn_l-dark.png
new file mode 100644
index 00000000..1f83fe92
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_uturn_l-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0b6468cd07a8d8bc8cc3b3d0b7049bb8b97a3351eef1a872531702db81ff09e1
+size 1283
diff --git a/apps/com.pelagicore.hud/assets/nav_uturn_l.png b/apps/com.pelagicore.hud/assets/nav_uturn_l.png
new file mode 100644
index 00000000..1f83fe92
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_uturn_l.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0b6468cd07a8d8bc8cc3b3d0b7049bb8b97a3351eef1a872531702db81ff09e1
+size 1283
diff --git a/apps/com.pelagicore.hud/assets/nav_uturn_r-dark.png b/apps/com.pelagicore.hud/assets/nav_uturn_r-dark.png
new file mode 100644
index 00000000..110c55a4
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_uturn_r-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a86f2f40fbb40a701d7135e3a302d6464893d9c84ffee6ff97109f63c9dccf18
+size 1324
diff --git a/apps/com.pelagicore.hud/assets/nav_uturn_r.png b/apps/com.pelagicore.hud/assets/nav_uturn_r.png
new file mode 100644
index 00000000..110c55a4
--- /dev/null
+++ b/apps/com.pelagicore.hud/assets/nav_uturn_r.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a86f2f40fbb40a701d7135e3a302d6464893d9c84ffee6ff97109f63c9dccf18
+size 1324
diff --git a/apps/com.pelagicore.hud/helpers/helper.js b/apps/com.pelagicore.hud/helpers/helper.js
new file mode 100644
index 00000000..6c916f55
--- /dev/null
+++ b/apps/com.pelagicore.hud/helpers/helper.js
@@ -0,0 +1,36 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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 shared.Style 1.0 as Style
+
+function localAsset(asset, theme) {
+ var themeStr = theme === Style.Style.Dark ? "-dark" : "";
+ return "../assets/" + asset + themeStr + '.png'
+}
diff --git a/apps/com.pelagicore.hud/helpers/qmldir b/apps/com.pelagicore.hud/helpers/qmldir
new file mode 100644
index 00000000..8671f1d9
--- /dev/null
+++ b/apps/com.pelagicore.hud/helpers/qmldir
@@ -0,0 +1,2 @@
+module helpers
+Helper 1.0 helper.js
diff --git a/apps/com.pelagicore.hud/info.yaml b/apps/com.pelagicore.hud/info.yaml
index 9942eafb..50f5a6c8 100644
--- a/apps/com.pelagicore.hud/info.yaml
+++ b/apps/com.pelagicore.hud/info.yaml
@@ -1,12 +1,14 @@
formatVersion: 1
-formatType: am-application
+formatType: am-package
---
id: 'com.pelagicore.hud'
icon: 'icon.png'
-code: 'Main.qml'
-runtime: 'qml'
name:
en: 'HUD'
-applicationProperties: { private: { squishPort: 7725 } }
+applications:
+ - id: 'com.pelagicore.hud'
+ code: 'Main.qml'
+ runtime: 'qml'
+ applicationProperties: { private: { squishPort: 7725 } }
categories: [ 'hud' ]
diff --git a/apps/com.pelagicore.hud/panels/NaviPanel.qml b/apps/com.pelagicore.hud/panels/NaviPanel.qml
new file mode 100644
index 00000000..9581c30e
--- /dev/null
+++ b/apps/com.pelagicore.hud/panels/NaviPanel.qml
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 Cluster UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.10
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+import shared.Style 1.0
+import shared.Sizes 1.0
+import shared.animations 1.0
+import "../helpers" 1.0
+
+Item {
+ id: root
+
+ property string nextTurn
+ property string nextTurnDistanceMeasuredIn
+ property real nextTurnDistance
+
+ Image {
+ anchors.right: parent.right
+ anchors.verticalCenter: parent.verticalCenter
+ source: root.nextTurn !== ""
+ ? Helper.localAsset(root.nextTurn, Style.theme)
+ : ""
+ }
+
+ ProgressBar {
+ anchors.left: parent.left
+ anchors.verticalCenter: parent.verticalCenter
+ height: Sizes.dp(120)
+ width: Sizes.dp(20)
+ orientation: Qt.Vertical
+ visible: opacity > 0.0
+ opacity: root.nextTurnDistance <= 300 && root.nextTurnDistanceMeasuredIn === "m" ? 1 : 0
+ Behavior on opacity { DefaultNumberAnimation {} }
+
+ value: root.nextTurnDistance <= 300 && root.nextTurnDistanceMeasuredIn === "m"
+ ? root.nextTurnDistance / 300 : 0.0
+
+ style: ProgressBarStyle {
+ background: Rectangle {
+ radius: 2
+ color: "transparent"
+ border.color: "gray"
+ border.width: Sizes.dp(1)
+ implicitHeight: Sizes.dp(200)
+ implicitWidth: Sizes.dp(20)
+ }
+ progress: Rectangle {
+ color: "lightsteelblue"
+ border.color: "steelblue"
+ }
+ }
+ }
+}
diff --git a/apps/com.pelagicore.hud/panels/SpeedPanel.qml b/apps/com.pelagicore.hud/panels/SpeedPanel.qml
new file mode 100644
index 00000000..b019a196
--- /dev/null
+++ b/apps/com.pelagicore.hud/panels/SpeedPanel.qml
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 Cluster UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.8
+import QtQuick.Controls 2.2
+import shared.Style 1.0
+import shared.Sizes 1.0
+
+Item {
+ id: root
+
+ property real currentSpeed
+ property real speedLimit
+ property real cruiseSpeed
+
+ Rectangle {
+ anchors.centerIn: parent
+ anchors.verticalCenterOffset: Sizes.dp(60)
+ anchors.rightMargin: Sizes.dp(20)
+ width: Sizes.dp(50)
+ height: Sizes.dp(50)
+ radius: width / 2
+ border.color: (root.currentSpeed > root.speedLimit) ? "red" : "grey"
+ border.width: Sizes.dp(6)
+ opacity: (root.currentSpeed > root.speedLimit) ? 1.0 : 0.0
+ Behavior on opacity {
+ NumberAnimation { easing.type: Easing.OutCubic; duration: 270 }
+ }
+ Label {
+ anchors.centerIn: parent
+ text: Math.round(speedLimit)
+ opacity: Style.opacityHigh
+ font.pixelSize: Sizes.fontSizeXS
+ color: root.Style.theme === Style.Dark ? Style.mainColor : Style.contrastColor
+ }
+ }
+
+ Image {
+ id: cruiseIcon
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.horizontalCenterOffset: -Sizes.dp(18)
+ anchors.bottom: speed.top
+ opacity: (root.cruiseSpeed >= 30) ? 1 : 0.0
+ width: Sizes.dp(35)
+ height: Sizes.dp(31)
+ source: "../assets/ic-acc.png"
+ Behavior on opacity {
+ NumberAnimation { easing.type: Easing.OutCubic; duration: 270 }
+ }
+ }
+
+ Label {
+ anchors.left: cruiseIcon.right
+ anchors.leftMargin: Sizes.dp(10)
+ anchors.verticalCenter: cruiseIcon.verticalCenter
+ text: Math.round(root.cruiseSpeed)
+ font.weight: Font.Light
+ font.pixelSize: Sizes.fontSizeS
+ opacity: cruiseIcon.opacity
+ color: "white"
+ }
+
+ Label {
+ id: speed
+ anchors.centerIn: parent
+ text: Math.round(root.currentSpeed)
+ verticalAlignment: Text.AlignTop
+ horizontalAlignment: Text.AlignHCenter
+ font.weight: Font.DemiBold
+ color: Style.accentColor
+ opacity: Style.opacityHigh
+ font.pixelSize: Sizes.fontSizeXXL
+ }
+
+ Label {
+ anchors.centerIn: parent
+ anchors.horizontalCenterOffset: Sizes.dp(88)
+ text: qsTr("km/h")
+ font.weight: Font.Light
+ color: Style.accentColor
+ opacity: Style.opacityLow
+ font.pixelSize: Sizes.fontSizeM
+ }
+}
diff --git a/apps/com.pelagicore.hud/stores/AbstractStore.qml b/apps/com.pelagicore.hud/stores/AbstractStore.qml
new file mode 100644
index 00000000..e055fae5
--- /dev/null
+++ b/apps/com.pelagicore.hud/stores/AbstractStore.qml
@@ -0,0 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 Cluster UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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 shared.utils 1.0
+
+Store {
+ id: root
+
+ property real speed: 0.0
+ property real speedLimit: 0.0
+ property real speedCruise: 0.0
+ property string nextTurn: ""
+ property string nextTurnDistanceMeasuredIn: ""
+ property real nextTurnDistance: 0.0
+}
+
diff --git a/apps/com.pelagicore.hud/stores/RootStore.qml b/apps/com.pelagicore.hud/stores/RootStore.qml
new file mode 100644
index 00000000..4fe3c701
--- /dev/null
+++ b/apps/com.pelagicore.hud/stores/RootStore.qml
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 Cluster UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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 shared.com.pelagicore.remotesettings 1.0
+import shared.com.pelagicore.drivedata 1.0
+import shared.utils 1.0
+
+AbstractStore {
+ id: root
+
+ readonly property InstrumentCluster clusterSettings:
+ InstrumentCluster { id: clusterSettings }
+
+ readonly property NavigationState naviState:
+ NavigationState { id: naviState }
+
+ speed: clusterSettings.speed
+ speedLimit: clusterSettings.speedLimit
+ speedCruise: clusterSettings.speedCruise
+ nextTurn: naviState.nextTurn
+ nextTurnDistanceMeasuredIn: naviState.nextTurnDistanceMeasuredIn
+ nextTurnDistance: naviState.nextTurnDistance
+}
+
diff --git a/apps/com.pelagicore.hud/views/MainView.qml b/apps/com.pelagicore.hud/views/MainView.qml
new file mode 100644
index 00000000..68168bae
--- /dev/null
+++ b/apps/com.pelagicore.hud/views/MainView.qml
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 Cluster UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.8
+import QtQuick.Controls 2.2
+import shared.Style 1.0
+import shared.Sizes 1.0
+import shared.utils 1.0
+import "../stores"
+import "../panels"
+
+Item {
+ id: root
+
+ property RootStore rootStore
+
+ SpeedPanel {
+ id: speedPanel
+ width: Sizes.dp(150)
+ height: parent.height
+ anchors.centerIn: parent
+ currentSpeed: rootStore.speed
+ speedLimit: rootStore.speedLimit
+ cruiseSpeed: rootStore.speedCruise
+ }
+
+ NaviPanel {
+ width: Sizes.dp(120)
+ height: parent.height
+ anchors.top: speedPanel.top
+ anchors.right: speedPanel.left
+ nextTurn: rootStore.nextTurn
+ nextTurnDistance: rootStore.nextTurnDistance
+ nextTurnDistanceMeasuredIn: rootStore.nextTurnDistanceMeasuredIn
+ }
+}
diff --git a/apps/com.pelagicore.map/Main.qml b/apps/com.pelagicore.map/Main.qml
index 8713165a..830ab006 100644
--- a/apps/com.pelagicore.map/Main.qml
+++ b/apps/com.pelagicore.map/Main.qml
@@ -92,6 +92,24 @@ QtObject {
onMaximizeMap: {
mainWindow.riseWindow()
}
+
+ onMapCenterChanged: {
+ if (mainMap.mapReady)
+ store.mainMapCenter = [mainMap.mapCenter.latitude
+ , mainMap.mapCenter.longitude ];
+ }
+ onMapZoomLevelChanged: {
+ if (mainMap.mapReady)
+ store.mainMapZoomLevel = mainMap.mapZoomLevel;
+ }
+ onMapTiltChanged: {
+ if (mainMap.mapReady)
+ store.mainMapTilt = mainMap.mapTilt;
+ }
+ onMapBearingChanged: {
+ if (mainMap.mapReady)
+ store.mainMapBearing = mainMap.mapBearing;
+ }
}
// need a bit delay to give it a time to fetch the real internet status
@@ -129,6 +147,7 @@ QtObject {
id: applicationICWindowComponent
ICMapView {
id: icMapView
+ allowMapRendering: mainMap.store.allowMapRendering
anchors.fill: parent
mapPlugin: mainMap.store.mapPlugin
mapCenter: mainMap.mapCenter
@@ -136,12 +155,19 @@ QtObject {
mapTilt: mainMap.mapTilt
mapBearing: mainMap.mapBearing
activeMapType: Style.theme === Style.Light ?
- mainMap.store.getMapType(icMapView.mapReady, mainMap.store.defaultLightThemeId)
- : mainMap.store.getMapType(icMapView.mapReady, mainMap.store.defaultDarkThemeId);
+ mainMap.store.getMapType(icMapView.mapReady
+ , mainMap.store.defaultLightThemeId)
+ : mainMap.store.getMapType(icMapView.mapReady
+ , mainMap.store.defaultDarkThemeId);
+
+ nextTurnDistanceMeasuredIn:
+ mainMap.store.navigationStore.nextTurnDistanceMeasuredIn
+ nextTurnDistance: mainMap.store.navigationStore.nextTurnDistance
+ naviGuideDirection: mainMap.store.navigationStore.naviGuideDirection
Connections {
target: mainMap.store
- onNavigationDemoActiveChanged: {
+ function onNavigationDemoActiveChanged() {
if (mainMap.store.navigationDemoActive) {
icMapView.path = mainMap.store.routeModel.get(0).path;
icMapView.state = "demo_driving";
diff --git a/apps/com.pelagicore.map/assets/nav_bear_l-dark.png b/apps/com.pelagicore.map/assets/nav_bear_l-dark.png
new file mode 100644
index 00000000..d5383c84
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_bear_l-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:da6621b5650fc38d61af05b7b5824d733403a6caed69012124a4c78a541907f0
+size 870
diff --git a/apps/com.pelagicore.map/assets/nav_bear_l.png b/apps/com.pelagicore.map/assets/nav_bear_l.png
new file mode 100644
index 00000000..788595fd
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_bear_l.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:445d12de0c8e036abc18343f1fa1e34cd2cff0f2f012a3c7256ddd7e2318431b
+size 923
diff --git a/apps/com.pelagicore.map/assets/nav_bear_r-dark.png b/apps/com.pelagicore.map/assets/nav_bear_r-dark.png
new file mode 100644
index 00000000..3ded2531
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_bear_r-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ec067d873d75de30164b07de9d30e139220352754ba07507638300b04d838a02
+size 878
diff --git a/apps/com.pelagicore.map/assets/nav_bear_r.png b/apps/com.pelagicore.map/assets/nav_bear_r.png
new file mode 100644
index 00000000..11d61ceb
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_bear_r.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3fec1e3bb182bb8801b3f98d8adb18c3af250833de5098ed23b05f135c24830d
+size 938
diff --git a/apps/com.pelagicore.map/assets/nav_hard_l-dark.png b/apps/com.pelagicore.map/assets/nav_hard_l-dark.png
new file mode 100644
index 00000000..2b90181e
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_hard_l-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a226b2b445670415228fcd036121673aac79b0d04b903fe5f848a34d6948130b
+size 1113
diff --git a/apps/com.pelagicore.map/assets/nav_hard_l.png b/apps/com.pelagicore.map/assets/nav_hard_l.png
new file mode 100644
index 00000000..e7a94997
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_hard_l.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:03d245a4a5b2b9a3ed1e0203637163f10d8ee434338ef382c42904522b84994f
+size 1167
diff --git a/apps/com.pelagicore.map/assets/nav_hard_r-dark.png b/apps/com.pelagicore.map/assets/nav_hard_r-dark.png
new file mode 100644
index 00000000..51f7365d
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_hard_r-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1eb11f5af439d5ca8f3ac483d9dbeaa37e917ce90ebe789f130fc74df65fb84d
+size 1057
diff --git a/apps/com.pelagicore.map/assets/nav_hard_r.png b/apps/com.pelagicore.map/assets/nav_hard_r.png
new file mode 100644
index 00000000..025190ac
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_hard_r.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bbeace26bdc407f07485650b939f256af549b65bf4d9779e87176085d0840a3c
+size 1096
diff --git a/apps/com.pelagicore.map/assets/nav_left-dark.png b/apps/com.pelagicore.map/assets/nav_left-dark.png
new file mode 100644
index 00000000..ce132b37
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_left-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2b178943f15563fdcf9bb4c246308d7981ebff6450f5f8a4f4b8bbc285139348
+size 848
diff --git a/apps/com.pelagicore.map/assets/nav_left.png b/apps/com.pelagicore.map/assets/nav_left.png
new file mode 100644
index 00000000..642feb9f
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_left.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4c581d4e99b5a60f33519fbcd8ef9172a294e4628287fb3735427e61aa26dd5e
+size 895
diff --git a/apps/com.pelagicore.map/assets/nav_light_left-dark.png b/apps/com.pelagicore.map/assets/nav_light_left-dark.png
new file mode 100644
index 00000000..6f30cddf
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_light_left-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:85b7b65fc75cc448610ea57ab618cf4fdd1a36ddef7bb2108def83e27e4b7f9f
+size 1090
diff --git a/apps/com.pelagicore.map/assets/nav_light_left.png b/apps/com.pelagicore.map/assets/nav_light_left.png
new file mode 100644
index 00000000..ac4d8bc8
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_light_left.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fd9b7c13e6c5820fcef132f957a053a7d33aeb75f94754963aae8ddd77059d73
+size 1142
diff --git a/apps/com.pelagicore.map/assets/nav_light_right-dark.png b/apps/com.pelagicore.map/assets/nav_light_right-dark.png
new file mode 100644
index 00000000..ebc90038
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_light_right-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2be3e5a99c79af84addf4030838a6bfc1d9a141c316bce125f7b9cf2fdaf03da
+size 1113
diff --git a/apps/com.pelagicore.map/assets/nav_light_right.png b/apps/com.pelagicore.map/assets/nav_light_right.png
new file mode 100644
index 00000000..70b9eaed
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_light_right.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1a26eb7dae93ff7ef4d320bb5d3f54e276ab45c0fb25f7af0f82e70689d5299c
+size 1179
diff --git a/apps/com.pelagicore.map/assets/nav_right-dark.png b/apps/com.pelagicore.map/assets/nav_right-dark.png
new file mode 100644
index 00000000..8866c5b7
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_right-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c8eed602798517d3f439512bb3cc281deac2b5387e0573c2da9449727aee0056
+size 799
diff --git a/apps/com.pelagicore.map/assets/nav_right.png b/apps/com.pelagicore.map/assets/nav_right.png
new file mode 100644
index 00000000..564e8832
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_right.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0578ca0818dce6e8c9a775a8c1f49cbd825d2eea9e1082b466006e3904a201bf
+size 847
diff --git a/apps/com.pelagicore.map/assets/nav_straight-dark.png b/apps/com.pelagicore.map/assets/nav_straight-dark.png
new file mode 100644
index 00000000..218c6a76
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_straight-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:694337b302e02615c664884fa0021c448bb45d036df3d42a58b1b9bf947f6400
+size 379
diff --git a/apps/com.pelagicore.map/assets/nav_straight.png b/apps/com.pelagicore.map/assets/nav_straight.png
new file mode 100644
index 00000000..84946dc3
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_straight.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a48d636e373e12d7de40535ff5743cfd8f36f37b374d6dd401b312b54e52090f
+size 427
diff --git a/apps/com.pelagicore.map/assets/nav_uturn_l-dark.png b/apps/com.pelagicore.map/assets/nav_uturn_l-dark.png
new file mode 100644
index 00000000..1f83fe92
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_uturn_l-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0b6468cd07a8d8bc8cc3b3d0b7049bb8b97a3351eef1a872531702db81ff09e1
+size 1283
diff --git a/apps/com.pelagicore.map/assets/nav_uturn_l.png b/apps/com.pelagicore.map/assets/nav_uturn_l.png
new file mode 100644
index 00000000..2554bf45
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_uturn_l.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0488de2c6e86dabdc7c4878863221730558b836eb9d5d0073a1c37e997797ef0
+size 1348
diff --git a/apps/com.pelagicore.map/assets/nav_uturn_r-dark.png b/apps/com.pelagicore.map/assets/nav_uturn_r-dark.png
new file mode 100644
index 00000000..110c55a4
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_uturn_r-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a86f2f40fbb40a701d7135e3a302d6464893d9c84ffee6ff97109f63c9dccf18
+size 1324
diff --git a/apps/com.pelagicore.map/assets/nav_uturn_r.png b/apps/com.pelagicore.map/assets/nav_uturn_r.png
new file mode 100644
index 00000000..2b58ba7e
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/nav_uturn_r.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b981cc2e4515117cf75b4429c617d8690240cd9084977bcea08c08862d006f11
+size 1352
diff --git a/apps/com.pelagicore.map/assets/proxy-CC-dark.png b/apps/com.pelagicore.map/assets/proxy-CC-dark.png
new file mode 100644
index 00000000..03044fd7
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/proxy-CC-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bd86430354edacd310c9320267915b5b644f42e2c1bf33ad2b45259601171196
+size 352776
diff --git a/apps/com.pelagicore.map/assets/proxy-CC.png b/apps/com.pelagicore.map/assets/proxy-CC.png
new file mode 100644
index 00000000..d715ce96
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/proxy-CC.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ce4dc9a3855e7b81e410ff81ff4dc5320cfc0cb7a2e1ed3ab3e14752c7ac386d
+size 439601
diff --git a/apps/com.pelagicore.map/assets/proxy-cluster-dark.png b/apps/com.pelagicore.map/assets/proxy-cluster-dark.png
new file mode 100644
index 00000000..f3212b08
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/proxy-cluster-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ac10655ea68c4f2180d36d836fae17501798ae72a538f3649e11561d11e83d81
+size 925461
diff --git a/apps/com.pelagicore.map/assets/proxy-cluster.png b/apps/com.pelagicore.map/assets/proxy-cluster.png
new file mode 100644
index 00000000..dbe59581
--- /dev/null
+++ b/apps/com.pelagicore.map/assets/proxy-cluster.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5ccea24d5c04263cc63e8f2509b03575fd09e636101d7ec76a11e9a5aaf97d45
+size 1055668
diff --git a/apps/com.pelagicore.map/helpers/StandAlone.qml b/apps/com.pelagicore.map/helpers/StandAlone.qml
index 85970fcc..1d1799e1 100644
--- a/apps/com.pelagicore.map/helpers/StandAlone.qml
+++ b/apps/com.pelagicore.map/helpers/StandAlone.qml
@@ -32,6 +32,7 @@
import QtQuick 2.9
import QtQuick.Window 2.3
+import QtQml 2.14
import shared.utils 1.0
import shared.Style 1.0
@@ -46,7 +47,11 @@ Window {
color: root.contentItem.Style.theme === Style.Dark ? "black" : "white"
- Binding { target: Style; property: "assetPath"; value: Qt.resolvedUrl("/opt/neptune3/imports/assets/") }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: Style; property: "assetPath";
+ value: Qt.resolvedUrl("/opt/neptune3/imports/assets/");
+ }
Shortcut {
sequence: "Ctrl+t"
diff --git a/apps/com.pelagicore.map/info.yaml b/apps/com.pelagicore.map/info.yaml
index ab501dc8..1d2d39f6 100644
--- a/apps/com.pelagicore.map/info.yaml
+++ b/apps/com.pelagicore.map/info.yaml
@@ -1,10 +1,8 @@
formatVersion: 1
-formatType: am-application
+formatType: am-package
---
id: 'com.pelagicore.map'
icon: 'icon.png'
-code: 'Main.qml'
-runtime: 'qml'
name:
en: 'Maps'
de: 'Karten'
@@ -14,6 +12,14 @@ name:
ja: '地図'
ko: '지도'
-applicationProperties: { private: { squishPort: 7726 } }
+applications:
+- id: 'com.pelagicore.map'
+ code: 'Main.qml'
+ runtime: 'qml'
+ applicationProperties: { private: { squishPort: 7726 } }
+
categories: [ 'navigation', 'widget' ]
-mimeTypes: [ 'x-scheme-handler/x-map' ]
+intents:
+- id: show-destination
+- id: activate-app
+
diff --git a/apps/com.pelagicore.map/panels/FavDestinationButtonsPanel.qml b/apps/com.pelagicore.map/panels/FavDestinationButtonsPanel.qml
index 7c942abe..5ce37a4b 100644
--- a/apps/com.pelagicore.map/panels/FavDestinationButtonsPanel.qml
+++ b/apps/com.pelagicore.map/panels/FavDestinationButtonsPanel.qml
@@ -66,7 +66,7 @@ Item {
primaryText: qsTr("Home")
extendedText: homeRouteTime
//TODO: add properties to the root object to access this externally
- secondaryText: "Welandergatan 29"
+ secondaryText: qsTr("Welandergatan 29")
onClicked: root.showDestinationPoint(root.homeAddressData, secondaryText)
}
Rectangle {
@@ -85,7 +85,7 @@ Item {
primaryText: qsTr("Work")
extendedText: workRouteTime
//TODO: add properties to the root object to access this externally
- secondaryText: "Östra Hamngatan 16"
+ secondaryText: qsTr("Östra Hamngatan 16")
onClicked: root.showDestinationPoint(root.workAddressData, secondaryText)
}
}
diff --git a/apps/com.pelagicore.map/panels/ProxyErrorPanel.qml b/apps/com.pelagicore.map/panels/ProxyErrorPanel.qml
new file mode 100644
index 00000000..9beec9bb
--- /dev/null
+++ b/apps/com.pelagicore.map/panels/ProxyErrorPanel.qml
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.14
+import QtQuick.Controls 2.14
+
+import shared.utils 1.0
+import shared.Style 1.0
+import shared.Sizes 1.0
+import shared.animations 1.0
+
+import "../helpers" 1.0
+
+Item {
+ id: root
+
+ property bool clusterWindow: false
+ property alias errorText: errorLabel.text
+
+ clip: true
+
+ Image {
+ width: root.clusterWindow
+ ? Sizes.dp(Config.instrumentClusterWidth)
+ : Sizes.dp(Config.centerConsoleWidth)
+ height: root.clusterWindow
+ ? Sizes.dp(Config.instrumentClusterWidth / Config.instrumentClusterUIAspectRatio)
+ : Sizes.dp(Config.centerConsoleHeight)
+
+ anchors.centerIn: root
+ source: root.clusterWindow
+ ? Helper.localAsset("proxy-cluster", Style.theme)
+ : Helper.localAsset("proxy-CC", Style.theme)
+ }
+
+ Image {
+ anchors.fill: root
+ source: Helper.localAsset("bg-home-navigation-overlay", Style.theme)
+ visible: root.clusterWindow && mainWindow.neptuneState === "Maximized"
+ scale: mainWindow.neptuneState === "Maximized" ? 1.2 : 1.6
+ Behavior on scale {
+ DefaultNumberAnimation { }
+ }
+ }
+
+ Label {
+ id: errorLabel
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.top: parent.top
+ font.pixelSize: Sizes.fontSizeM
+ font.bold: true
+
+ anchors.topMargin: root.clusterWindow
+ ? root.height / 2
+ : mainWindow.currentHeight / 2
+
+ Behavior on anchors.topMargin {
+ DefaultNumberAnimation { }
+ }
+ }
+}
diff --git a/apps/com.pelagicore.map/panels/qmldir b/apps/com.pelagicore.map/panels/qmldir
index eb37c5c4..b73edbb7 100644
--- a/apps/com.pelagicore.map/panels/qmldir
+++ b/apps/com.pelagicore.map/panels/qmldir
@@ -6,3 +6,4 @@ MapHeaderPanel 1.0 MapHeaderPanel.qml
NavigationConfirmPanel 1.0 NavigationConfirmPanel.qml
NavigationSearchPanel 1.0 NavigationSearchPanel.qml
SearchOverlayPanel 1.0 SearchOverlayPanel.qml
+ProxyErrorPanel 1.0 ProxyErrorPanel.qml
diff --git a/apps/com.pelagicore.map/stores/MapStore.qml b/apps/com.pelagicore.map/stores/MapStore.qml
index 5c35d6fe..fe2725dc 100644
--- a/apps/com.pelagicore.map/stores/MapStore.qml
+++ b/apps/com.pelagicore.map/stores/MapStore.qml
@@ -36,6 +36,7 @@ import QtPositioning 5.9
import QtLocation 5.9
import Qt.labs.platform 1.0
import shared.utils 1.0
+import shared.com.pelagicore.systeminfo 1.0
QtObject {
id: root
@@ -55,6 +56,9 @@ QtObject {
}
}
+ readonly property SystemInfo systemInfo: SystemInfo {}
+ readonly property bool allowMapRendering: sysinfo.allowOpenGLContent
+
property var positionCoordinate: QtPositioning.coordinate(48.135771, 11.574052) // Munich
property var originalPosition: positionCoordinate
readonly property string defaultLightThemeId: "mapbox://styles/qtauto/cjcm1by3q12dk2sqnquu0gju9"
@@ -68,23 +72,35 @@ QtObject {
property var destCoord: QtPositioning.coordinate()
property string destination
+ property alias mainMapCenter: navigationStore.mapCenter
+ property alias mainMapZoomLevel: navigationStore.mapZoomLevel
+ property alias mainMapTilt: navigationStore.mapTilt
+ property alias mainMapBearing: navigationStore.mapBearing
property alias navigationDemoActive: navigationStore.active
readonly property var navigationStore: NavigationStore {
id: navigationStore
model: root.routeModel
}
- property var appInterface: Connections {
- target: ApplicationInterface
- onOpenDocument: {
- var request = documentUrl.slice(8, documentUrl.length);
- var dest = "";
- if (request.indexOf("getmeto/") >= 0) {
- dest = request.slice(8, request.length);
- root.destination = dest;
- requestGeoCodeModel.reset();
- requestGeoCodeModel.query = dest;
- requestGeoCodeModel.update();
+ readonly property IntentHandler intentHandler: IntentHandler {
+ intentIds: ["show-destination", "activate-app"]
+ onRequestReceived: {
+ switch (request.intentId) {
+ case "show-destination":
+ var destinationName = request.parameters["destination"];
+ if (!!destinationName && destinationName.length > 0) {
+ root.destination = destinationName;
+ requestGeoCodeModel.reset();
+ requestGeoCodeModel.query = destinationName;
+ requestGeoCodeModel.update();
+ }
+ break;
+
+ case "activate-app":
+ root.requestRaiseAppReceived();
+ break;
+ default:
+ break;
}
}
}
@@ -107,6 +123,7 @@ QtObject {
}
signal requestNavigationReceived(string address, var coord, var boundingBox)
+ signal requestRaiseAppReceived()
function fetchCurrentLocation() { // PositionSource doesn't work on Linux
var req = new XMLHttpRequest;
@@ -114,10 +131,10 @@ QtObject {
if (req.readyState === XMLHttpRequest.DONE) {
var objectArray = JSON.parse(req.responseText);
if (objectArray.errors !== undefined) {
- console.warn("Error fetching location:", objectArray.errors[0].message);
+ console.warn(qLcMaps, "Error fetching location:", objectArray.errors[0].message);
} else {
root.positionCoordinate = QtPositioning.coordinate(objectArray.location.lat, objectArray.location.lng);
- console.info("Current location:", root.positionCoordinate);
+ console.info(qLcMaps, "Current location:", root.positionCoordinate);
}
}
}
@@ -128,11 +145,11 @@ QtObject {
function getAvailableMapsAndLocation(mapReady, supportedMapTypes) {
if (mapReady) {
mapTypeModel.clear();
- console.info("Supported map types:");
+ console.info(qLcMaps, "Supported map types:");
for (var i = 0; i < supportedMapTypes.length; i++) {
var map = supportedMapTypes[i];
mapTypeModel.append({"name": map.name, "data": map}) // fill the map type model
- console.info("\t", map.name, ", description:", map.description, ", style:", map.style, ", night mode:", map.night);
+ console.info(qLcMaps, "\t", map.name, ", description:", map.description, ", style:", map.style, ", night mode:", map.night);
}
if (!root.offlineMapsEnabled) {
fetchCurrentLocation();
@@ -209,13 +226,13 @@ QtObject {
plugin: herePlugin
onStatusChanged: {
if (status === GeocodeModel.Null) {
- console.info("Search model idle");
+ console.info(qLcMaps, "Search model idle");
} else if (status === GeocodeModel.Ready) {
- console.info("Search model ready, results:", count)
+ console.info(qLcMaps, "Search model ready, results:", count)
} else if (status === GeocodeModel.Loading) {
- console.info("Search model busy");
+ console.info(qLcMaps, "Search model busy");
} else if (status === GeocodeModel.Error) {
- console.warn("Search model error:", error, errorString);
+ console.warn(qLcMaps, "Search model error:", error, errorString);
}
}
limit: 20
@@ -225,26 +242,28 @@ QtObject {
id: routeModel
autoUpdate: !!root.startCoord && !!root.destCoord
query: RouteQuery {
- waypoints: [root.startCoord, root.destCoord]
+ waypoints: root.startCoord.isValid && root.destCoord.isValid
+ ? [root.startCoord, root.destCoord]
+ : []
}
plugin: herePlugin
onStatusChanged: {
if (status === RouteModel.Null) {
- console.info("Route model idle");
+ console.info(qLcMaps, "Route model idle");
} else if (status === RouteModel.Ready) {
- console.info("Route model ready, results:", count)
+ console.info(qLcMaps, "Route model ready, results:", count)
if (count > 0) {
root.routeDistance = formatMeters(get(0).distance);
root.routeTime = formatSeconds(get(0).travelTime);
- console.info("Route distance (km):", root.routeDistance
+ console.info(qLcMaps, "Route distance (km):", root.routeDistance
, ", time:", root.routeTime);
- console.info("First coord:", get(0).segments[0].path[0])
+ console.info(qLcMaps, "First coord:", get(0).segments[0].path[0])
}
} else if (status === RouteModel.Loading) {
- console.info("Route model busy");
+ console.info(qLcMaps, "Route model busy");
} else if (status === RouteModel.Error) {
- console.warn("Route model error:", error, errorString);
+ console.warn(qLcMaps, "Route model error:", error, errorString);
}
}
}
@@ -252,7 +271,9 @@ QtObject {
readonly property RouteModel homeRouteModel: RouteModel {
autoUpdate: !!root.currentLocationCoord && !!root.homeCoord
query: RouteQuery {
- waypoints: [root.currentLocationCoord, root.homeCoord]
+ waypoints: root.currentLocationCoord.isValid && root.homeCoord.isValid
+ ? [root.currentLocationCoord, root.homeCoord]
+ : []
}
plugin: herePlugin
@@ -260,7 +281,7 @@ QtObject {
if (status === RouteModel.Ready) {
if (count > 0) {
root.homeRouteTime = formatSeconds(get(0).travelTime);
- console.info("Home route distance (km):", formatMeters(get(0).distance), ", time:", root.homeRouteTime)
+ console.info(qLcMaps, "Home route distance (km):", formatMeters(get(0).distance), ", time:", root.homeRouteTime)
}
}
}
@@ -269,14 +290,16 @@ QtObject {
readonly property RouteModel workRouteModel: RouteModel {
autoUpdate: !!root.currentLocationCoord && !!root.workCoord
query: RouteQuery {
- waypoints: [root.currentLocationCoord, root.workCoord]
+ waypoints: root.currentLocationCoord.isValid && root.workCoord.isValid
+ ? [root.currentLocationCoord, root.workCoord]
+ : []
}
plugin: herePlugin
onStatusChanged: {
if (status === RouteModel.Ready) {
if (count > 0) {
root.workRouteTime = formatSeconds(get(0).travelTime);
- console.info("Work route distance (km):", formatMeters(get(0).distance), ", time:", root.workRouteTime)
+ console.info(qLcMaps, "Work route distance (km):", formatMeters(get(0).distance), ", time:", root.workRouteTime)
}
}
}
@@ -289,6 +312,10 @@ QtObject {
onTriggered: showOfflineMapInfo()
}
+ readonly property LoggingCategory qLcMaps: LoggingCategory {
+ name: "shared.com.pelagicore.map"
+ }
+
function showOfflineNotification() {
var notification = ApplicationInterface.createNotification();
notification.summary = qsTr("Offline mode");
diff --git a/apps/com.pelagicore.map/stores/NavigationStore.qml b/apps/com.pelagicore.map/stores/NavigationStore.qml
index 3f85b4bc..525dd2ce 100644
--- a/apps/com.pelagicore.map/stores/NavigationStore.qml
+++ b/apps/com.pelagicore.map/stores/NavigationStore.qml
@@ -35,19 +35,78 @@ import QtQuick.Layouts 1.3
import QtLocation 5.9
import QtPositioning 5.9
import shared.animations 1.0
-
+import shared.com.pelagicore.drivedata 1.0
/// class that takes route segments, prepares demo from it, and produces
/// points and vehicle(arrow marker / map bearing) angle
QtObject {
id: root
+
+ readonly property NavigationState naviState: NavigationState {
+ id: naviState
+ mapBearing: root.mapBearing
+ mapZoomLevel: root.mapZoomLevel
+ mapTilt: root.mapTilt
+ mapCenter: root.mapCenter
+ onIsInitializedChanged: {
+ naviState.nextTurn = "";
+ naviState.nextTurnDistanceMeasuredIn = "";
+ naviState.nextTurnDistance = 0;
+ }
+ }
+
// input properties
property var model
property bool active
+ property var mapCenter
+ property real mapZoomLevel
+ property real mapTilt
+ property real mapBearing
+
// output properties
property var location: QtPositioning.coordinate()
property real angle: 0.0
+ property string naviGuideDirection: ""
+ onNaviGuideDirectionChanged: {
+ naviState.nextTurn = naviGuideDirection;
+ }
+
+ // in meters
+ property real naviGuideDistance: 0.0
+ onNaviGuideDistanceChanged: {
+ var d = naviGuideDistance;
+ if (d >= 1000) {
+ d = d / 1000 + 0.1;
+ root.nextTurnDistanceMeasuredIn = qsTr("km");
+ root.nextTurnDistance = d.toFixed(1);
+ } else {
+ if (d < 100) {
+ d = d - d % 10 + 10;
+ } else {
+ d = d - d % 50 + 50;
+ }
+
+ root.nextTurnDistanceMeasuredIn = qsTr("m");
+ root.nextTurnDistance = d;
+ }
+ }
+
+ property string nextTurnDistanceMeasuredIn: ""
+ onNextTurnDistanceMeasuredInChanged: {
+ naviState.nextTurnDistanceMeasuredIn = root.nextTurnDistanceMeasuredIn;
+ }
+ property real nextTurnDistance: 0
+ onNextTurnDistanceChanged: {
+ naviState.nextTurnDistance = root.nextTurnDistance;
+ }
+
+ property real remainingDistance: 0.0
+
+ // in seconds
+ property int remainingTime: 0.0
+
+ property var maneuverPoint: QtPositioning.coordinate()
// inner properties
property var segmentsList
@@ -59,6 +118,10 @@ QtObject {
property var currentSegment
property int currentSegment_PathCurrentPointIdx: 0
+ property var maneuversPointsList
+ property var maneuversDirectionList
+ property int maneuverIdx
+
// m/s ~ 75km/h
readonly property real speed: 20.8
@@ -70,6 +133,8 @@ QtObject {
}
var route = root.model.get(0);
+ remainingDistance = route.distance;
+ remainingTime = route.travelTime;
pathCurrentPointIdx = 0;
currentSegment_PathCurrentPointIdx = 0;
segmentsListCurrentIdx = 0;
@@ -80,12 +145,99 @@ QtObject {
root.location = currentSegment.path[0];
root.angle = path[0].azimuthTo(path[1]);
+ maneuverIdx = 1;
+ maneuversPointsList = [];
+ maneuversDirectionList = [];
+ for (var i = 0; i < segmentsList.length; ++i) {
+ maneuversPointsList.push(segmentsList[i].maneuver.position);
+ maneuversDirectionList.push(segmentsList[i].maneuver.direction)
+ }
+
+ maneuverPoint = maneuversPointsList[maneuverIdx];
+ naviGuideDistance = calculateDistanceToNext(0, maneuverPoint);
+ setNaviGuideDirectionFromManeuverDiredection(maneuversDirectionList[maneuverIdx]);
+
+
+ var rawPoints = [];
+ for (var i = 0; i < path.length; ++i) {
+ rawPoints.push([path[i].latitude, path[i].longitude]);
+ }
+
+ naviState.routePoints = rawPoints;
+
setNextAnimation();
} else if (movementAnimation.running) {
movementAnimation.stop()
+ // reset the states
+ naviState.routePoints = [];
+ naviGuideDirection = "";
+ nextTurnDistanceMeasuredIn = "";
+ nextTurnDistance = 0;
}
}
+ function calculateDistanceToNext(curPathIdx, maneuverPoint) {
+ var j = curPathIdx;
+ var calculatedDistance = 0.0;
+ while (path[j] !== maneuverPoint && j+1 < path.length) {
+ calculatedDistance += path[j].distanceTo(path[j+1]);
+ ++j;
+ }
+
+ return calculatedDistance;
+ }
+
+ function setNaviGuideDirectionFromManeuverDiredection(direction) {
+ switch (direction) {
+ case RouteManeuver.NoDirection:
+ naviGuideDirection = "nav_nodir";
+ break;
+ case RouteManeuver.DirectionForward:
+ naviGuideDirection = "nav_straight";
+ break;
+ case RouteManeuver.DirectionBearRight:
+ naviGuideDirection = "nav_bear_r";
+ break;
+ case RouteManeuver.DirectionLightRight:
+ naviGuideDirection = "nav_light_right";
+ break;
+ case RouteManeuver.DirectionRight:
+ naviGuideDirection = "nav_right";
+ break;
+ case RouteManeuver.DirectionHardRight:
+ naviGuideDirection = "nav_hard_r";
+ break;
+ case RouteManeuver.DirectionUTurnRight:
+ naviGuideDirection = "nav_uturn_r";
+ break;
+ case RouteManeuver.DirectionUTurnLeft:
+ naviGuideDirection = "nav_uturn_l";
+ break;
+ case RouteManeuver.DirectionHardLeft:
+ naviGuideDirection = "nav_hard_l";
+ break;
+ case RouteManeuver.DirectionLeft:
+ naviGuideDirection = "nav_left";
+ break;
+ case RouteManeuver.DirectionLightLeft:
+ naviGuideDirection = "nav_light_left";
+ break;
+ case RouteManeuver.DirectionBearLeft:
+ naviGuideDirection = "nav_bear_l";
+ break;
+ default:
+ naviGuideDirection = "";
+ break;
+ }
+ }
+
+ function updateNaviGuide() {
+ if (maneuverIdx + 1 >= maneuversPointsList.length) return;
+ maneuverPoint = maneuversPointsList[++maneuverIdx];
+ naviGuideDistance = calculateDistanceToNext(pathCurrentPointIdx-1, maneuverPoint);
+ setNaviGuideDirectionFromManeuverDiredection(maneuversDirectionList[maneuverIdx]);
+ }
+
function setNextAnimation() {
if (!root.active) {
return;
@@ -97,13 +249,23 @@ QtObject {
if (!endPos) {
// arrived;
+ naviGuideDistance = 0.0;
+ naviState.routePoints = [];
+ naviGuideDirection = "";
+ nextTurnDistanceMeasuredIn = "";
return;
}
+ if (maneuverPoint === startPos) {
+ updateNaviGuide();
+ }
+
// segment, path inside it
if (++currentSegment_PathCurrentPointIdx >= currentSegment.path.length) {
- currentSegment_PathCurrentPointIdx = 0
- currentSegment = segmentsList[++segmentsListCurrentIdx];
+ currentSegment_PathCurrentPointIdx = 0;
+ remainingTime -= currentSegment.travelTime;
+ remainingDistance -= currentSegment.distance;
+ currentSegment = segmentsList[++segmentsListCurrentIdx];
}
// Calculate new direction
@@ -132,6 +294,10 @@ QtObject {
movementAnimation.coordinateDuration = pathDistance / speed * 1000;
movementAnimation.rotationDirection = newDir;
movementAnimation.targetCoordinate = endPos;
+ movementAnimation.distanceForNextManeuver = root.naviGuideDistance - pathDistance;
+ movementAnimation.distanceForNextManeuver = movementAnimation.distanceForNextManeuver > 0
+ ? movementAnimation.distanceForNextManeuver
+ : 0.0;
movementAnimation.start();
}
@@ -140,7 +306,8 @@ QtObject {
property real rotationDuration: 0
property real rotationDirection: 0
property real coordinateDuration: 0
- property var targetCoordinate
+ property real distanceForNextManeuver: 0
+ property var targetCoordinate: QtPositioning.coordinate()
property real azimuthDt: 0
readonly property real angleThreshold: 25.0
@@ -179,6 +346,13 @@ QtObject {
duration: movementAnimation.coordinateDuration
to: movementAnimation.targetCoordinate
}
+
+ NumberAnimation {
+ target: root
+ property: "naviGuideDistance"
+ duration: movementAnimation.coordinateDuration
+ to: movementAnimation.distanceForNextManeuver
+ }
}
}
diff --git a/apps/com.pelagicore.map/views/ICMapView.qml b/apps/com.pelagicore.map/views/ICMapView.qml
index eb96825d..d13fccf8 100644
--- a/apps/com.pelagicore.map/views/ICMapView.qml
+++ b/apps/com.pelagicore.map/views/ICMapView.qml
@@ -32,11 +32,16 @@
import QtQuick 2.10
import QtLocation 5.9
+import QtPositioning 5.14
+import QtQuick.Controls 2.13
import shared.animations 1.0
import shared.Style 1.0
import shared.Sizes 1.0
+import "../helpers" 1.0
+import "../panels" 1.0
+
Item {
id: root
@@ -48,6 +53,12 @@ Item {
property alias activeMapType: mainMap.activeMapType
property var path
property var mapPlugin
+ property bool allowMapRendering
+
+
+ property string nextTurnDistanceMeasuredIn
+ property real nextTurnDistance
+ property string naviGuideDirection
state: "initial"
states: [
@@ -89,8 +100,13 @@ Item {
visible: true
path: root.path
}
+ PropertyChanges {
+ target: instructions
+ visible: root.naviGuideDirection !== ""
+ }
}
]
+
Map {
id: mainMap
anchors.fill: parent
@@ -99,6 +115,7 @@ Item {
zoomLevel: 10
plugin: root.mapPlugin
copyrightsVisible: false
+ visible: root.allowMapRendering
MapPolyline {
id: pathView
@@ -119,6 +136,46 @@ Item {
}
}
+ Item {
+ id: instructions
+ visible: false
+ anchors.top: posMarker.bottom
+ anchors.topMargin: Sizes.dp(100)
+ anchors.horizontalCenter: posMarker.horizontalCenter
+ width: Sizes.dp(660)
+ height: Sizes.dp(100)
+
+ Rectangle {
+ anchors.fill: parent
+ opacity: 0.5
+ color: Style.theme === Style.Dark ? "black" : "white"
+ radius: 10
+ }
+
+ Label {
+ width: Sizes.dp(400)
+ height: Sizes.dp(100)
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.left: parent.left
+ anchors.leftMargin: Sizes.dp(30)
+ opacity: 0.9
+ font.pixelSize: Sizes.fontSizeXL
+ font.bold: true
+ verticalAlignment: Text.AlignVCenter
+ text: qsTr("Next turn: ") + root.nextTurnDistance
+ + " " + root.nextTurnDistanceMeasuredIn
+ }
+
+ Image {
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.right: parent.right
+ anchors.rightMargin: Sizes.dp(30)
+ source: root.naviGuideDirection !== ""
+ ? Helper.localAsset(root.naviGuideDirection, Style.theme)
+ : ""
+ }
+ }
+
MapQuickItem {
id: posMarker
anchorPoint: Qt.point(posImage.width * 0.5, posImage.height * 0.5)
@@ -130,4 +187,14 @@ Item {
}
}
}
+
+ Loader {
+ active: !root.allowMapRendering
+ anchors.fill: root
+ sourceComponent: ProxyErrorPanel {
+ anchors.fill: parent
+ clusterWindow: true
+ errorText: qsTr("The map is disabled in this runtime environment")
+ }
+ }
}
diff --git a/apps/com.pelagicore.map/views/MapView.qml b/apps/com.pelagicore.map/views/MapView.qml
index 9f415f13..2fee8c35 100644
--- a/apps/com.pelagicore.map/views/MapView.qml
+++ b/apps/com.pelagicore.map/views/MapView.qml
@@ -81,7 +81,8 @@ Item {
Connections {
target: root.store
- onRequestNavigationReceived: {
+ function onRequestNavigationReceived(address, coord, boundingBox) {
+ root.maximizeMap();
root.store.navigationDemoActive = false;
mapBoxPanel.state = "initial";
mapBoxPanel.center = coord;
@@ -94,10 +95,13 @@ Item {
}
mapBoxPanel.state = "destination_selection";
}
+
+ function onRequestRaiseAppReceived() { root.maximizeMap(); }
}
MapBoxPanel {
id: mapBoxPanel
+ visible: root.store.allowMapRendering
anchors.fill: parent
plugin: root.store.mapPlugin
center: root.store.positionCoordinate
@@ -160,6 +164,15 @@ Item {
onMaximizeMap: root.maximizeMap();
}
+ Loader {
+ active: !root.store.allowMapRendering
+ anchors.fill: root
+ sourceComponent: ProxyErrorPanel {
+ anchors.fill: parent
+ errorText: qsTr("The map is disabled in this runtime environment")
+ }
+ }
+
FastBlur {
anchors.fill: mapBoxPanel
source: mapBoxPanel
diff --git a/apps/com.pelagicore.music/info.yaml b/apps/com.pelagicore.music/info.yaml
index bab1b15b..0485aa22 100644
--- a/apps/com.pelagicore.music/info.yaml
+++ b/apps/com.pelagicore.music/info.yaml
@@ -1,10 +1,8 @@
formatVersion: 1
-formatType: am-application
+formatType: am-package
---
id: 'com.pelagicore.music'
icon: 'icon.png'
-code: 'Main.qml'
-runtime: 'qml'
name:
en: 'Music'
de: 'Musik'
@@ -13,8 +11,13 @@ name:
zh: '音乐'
ja: '音楽'
ko: '음악'
+applications:
+ - id: 'com.pelagicore.music'
+ code: 'Main.qml'
+ runtime: 'qml'
+ applicationProperties: { private: { squishPort: 7727 } }
-applicationProperties: { private: { squishPort: 7727 } }
categories: [ 'media', 'widget' ]
intents:
- id: activate-app
+- id: music-command
diff --git a/apps/com.pelagicore.music/popups/MusicSourcesPopup.qml b/apps/com.pelagicore.music/popups/MusicSourcesPopup.qml
index 2577342f..c8350b5c 100644
--- a/apps/com.pelagicore.music/popups/MusicSourcesPopup.qml
+++ b/apps/com.pelagicore.music/popups/MusicSourcesPopup.qml
@@ -51,7 +51,8 @@ PopupWindow {
Item {
id: popupContent
- anchors.fill: parent
+ width: root.width
+ height: root.height
Label {
id: header
diff --git a/apps/com.pelagicore.music/stores/MusicStore.qml b/apps/com.pelagicore.music/stores/MusicStore.qml
index d6468438..a69ef5e3 100644
--- a/apps/com.pelagicore.music/stores/MusicStore.qml
+++ b/apps/com.pelagicore.music/stores/MusicStore.qml
@@ -133,11 +133,11 @@ Store {
property ListModel musicSourcesModel: ListModel {
id: musicSourcesModel
ListElement {
- text: "Music"
+ text: qsTr("Music")
appId: "com.pelagicore.music"
}
ListElement {
- text: "AM/FM Radio"
+ text: qsTr("AM/FM Radio")
appId: "com.pelagicore.tuner"
}
}
@@ -145,7 +145,7 @@ Store {
property Connections con: Connections {
target: player.playQueue
- onRowsInserted: {
+ function onRowsInserted(parentIndex, first, last) {
console.log(Logging.apps, "Music Queue / Playlist Row Inserted: ", first);
player.playQueue.currentIndex = first;
}
@@ -159,6 +159,20 @@ Store {
}
}
+ property IntentHandler intentHandler2: IntentHandler {
+ intentIds: "music-command"
+ onRequestReceived: {
+ var receivedCommand = request.parameters["musiccommand"];
+ request.sendReply({ "done": true })
+
+ if (receivedCommand === "next") {
+ root.nextSong();
+ } else if (receivedCommand === "prev") {
+ root.previousSong();
+ }
+ }
+ }
+
signal requestToRise()
signal songModelPopulated()
diff --git a/apps/com.pelagicore.music/views/+lucee/FullScreenBottomView.qml b/apps/com.pelagicore.music/views/+lucee/FullScreenBottomView.qml
index 99247457..15167078 100644
--- a/apps/com.pelagicore.music/views/+lucee/FullScreenBottomView.qml
+++ b/apps/com.pelagicore.music/views/+lucee/FullScreenBottomView.qml
@@ -31,6 +31,7 @@
****************************************************************************/
import QtQuick 2.8
+import QtQml 2.14
import shared.utils 1.0
import shared.controls 1.0
import shared.animations 1.0
@@ -78,6 +79,7 @@ Item {
}
Binding {
+ restoreMode: Binding.RestoreBinding;
target: root.store; property: "contentType";
value: {
switch (rowViewOptions.currentText) {
@@ -159,7 +161,7 @@ Item {
width: Sizes.dp(130)
height: Sizes.dp(50)
font.pixelSize: Sizes.dp(17)
- text: "Title"
+ text: qsTr("Title")
textFormat: Text.RichText
font.weight: rowViewOptions.currentText === "track" ? Font.Bold : Font.Light
color: rowViewOptions.currentText === "track" ? Style.accentColor : "#5e5d5d"
@@ -177,7 +179,7 @@ Item {
width: Sizes.dp(130)
height: Sizes.dp(50)
font.pixelSize: Sizes.dp(17)
- text: "Artist"
+ text: qsTr("Artist")
textFormat: Text.RichText
font.weight: rowViewOptions.currentText === "artists" ? Font.Bold : Font.Light
color: rowViewOptions.currentText === "artists" ? Style.accentColor : "#5e5d5d"
@@ -195,7 +197,7 @@ Item {
width: Sizes.dp(130)
height: Sizes.dp(50)
font.pixelSize: Sizes.dp(17)
- text: "Album"
+ text: qsTr("Album")
textFormat: Text.RichText
font.weight: rowViewOptions.currentText === "albums" ? Font.Bold : Font.Light
color: rowViewOptions.currentText === "albums" ? Style.accentColor : "#5e5d5d"
diff --git a/apps/com.pelagicore.music/views/+lucee/MusicView.qml b/apps/com.pelagicore.music/views/+lucee/MusicView.qml
index 7696afaf..9362682f 100644
--- a/apps/com.pelagicore.music/views/+lucee/MusicView.qml
+++ b/apps/com.pelagicore.music/views/+lucee/MusicView.qml
@@ -100,7 +100,7 @@ Item {
onNextClicked: root.store.nextSong()
Connections {
target: store
- onSongModelPopulated: { artAndTitlesBlock.populateModel(); }
+ function onSongModelPopulated() { artAndTitlesBlock.populateModel(); }
}
}
diff --git a/apps/com.pelagicore.music/views/+lucee/WidgetContentView.qml b/apps/com.pelagicore.music/views/+lucee/WidgetContentView.qml
index efe2c403..cd824bb9 100644
--- a/apps/com.pelagicore.music/views/+lucee/WidgetContentView.qml
+++ b/apps/com.pelagicore.music/views/+lucee/WidgetContentView.qml
@@ -71,7 +71,7 @@ Item {
onNextClicked: store.nextSong()
Connections {
target: store
- onSongModelPopulated: { artAndTitlesBlock.populateModel(); }
+ function onSongModelPopulated() { artAndTitlesBlock.populateModel(); }
}
}
@@ -92,7 +92,7 @@ Item {
anchors.bottom: otherTracks.top
anchors.bottomMargin: Sizes.dp(15)
anchors.left: otherTracks.left
- text: "Discover similar music"
+ text: qsTr("Discover similar music")
font.pixelSize: Sizes.dp(26)
font.weight: Font.Normal
visible: root.state === "Widget3Rows"
diff --git a/apps/com.pelagicore.music/views/FullScreenBottomView.qml b/apps/com.pelagicore.music/views/FullScreenBottomView.qml
index 45677d6b..82767f33 100644
--- a/apps/com.pelagicore.music/views/FullScreenBottomView.qml
+++ b/apps/com.pelagicore.music/views/FullScreenBottomView.qml
@@ -31,6 +31,7 @@
****************************************************************************/
import QtQuick 2.8
+import QtQml 2.14
import shared.utils 1.0
import shared.controls 1.0
import shared.animations 1.0
@@ -81,15 +82,32 @@ Item {
}
onClicked: {
if (currentText === "sources") {
+ //set model each time to ensure data accuracy
+ musicSourcesPopup.model = root.store.musicSourcesModel
+
//FIXME in multiprocess store.musicSourcesModel.length returns 1
//even though is more. When spotify and/or web radio are uninstalled
//and installed again, then it updates fine.
- var pos = currentItem.mapToItem(root.rootItem, currentItem.width/2, currentItem.height/2);
+ let pos = currentItem.mapToItem(root.rootItem,
+ currentItem.width / 2,
+ currentItem.height / 2);
+ let posX = pos.x / root.Sizes.scale;
+ let posY = pos.y / root.Sizes.scale;
+
+ // caclulate popup height based on musicSources list items
+ // + 200 for header & margins
+ musicSourcesPopup.height = Qt.binding(() => {
+ return musicSourcesPopup.model
+ ? root.Sizes.dp(200 + (musicSourcesPopup.model.count * 96))
+ : root.Sizes.dp(296);
+ });
+ musicSourcesPopup.width = Qt.binding(() => root.Sizes.dp(910))
+ musicSourcesPopup.originItemX = Qt.binding(() => root.Sizes.dp(posX));
+ musicSourcesPopup.originItemY = Qt.binding(() => root.Sizes.dp(posY));
+ musicSourcesPopup.popupY = Qt.binding(() => {
+ return root.Sizes.dp(Config.centerConsoleHeight / 4);
+ });
- //set model each time to ensure data accuracy
- musicSourcesPopup.model = root.store.musicSourcesModel
- musicSourcesPopup.originItemX = pos.x;
- musicSourcesPopup.originItemY = pos.y;
musicSourcesPopup.visible = true;
}
}
@@ -98,23 +116,13 @@ Item {
MusicSourcesPopup {
id: musicSourcesPopup
- // MusicSourcesPopup a Window, not an Item, propagation of attached property values don't work
- // So have to use the Sizes from elsewhere, from an actual Item.
-
- width: root.Sizes.dp(910)
-
- // caclulate popup height based on musicSources list items
- // + 200 for header & margins
- height: model ? root.Sizes.dp(200 + (model.count * 96)) : root.Sizes.dp(296)
-
- popupY: root.Sizes.dp(Config.centerConsoleHeight / 4)
-
onSwitchSourceClicked: {
store.switchSource(source)
}
}
Binding {
+ restoreMode: Binding.RestoreBinding;
target: root.store; property: "contentType";
value: {
switch (toolsColumn.currentText) {
diff --git a/apps/com.pelagicore.music/views/WidgetContentView.qml b/apps/com.pelagicore.music/views/WidgetContentView.qml
index 75b7f77b..c1ab5c80 100644
--- a/apps/com.pelagicore.music/views/WidgetContentView.qml
+++ b/apps/com.pelagicore.music/views/WidgetContentView.qml
@@ -119,7 +119,7 @@ Item {
onNextClicked: root.store.nextSong()
Connections {
target: root.store
- onSongModelPopulated: { artAndTitlesBlock.populateModel(); }
+ function onSongModelPopulated() { artAndTitlesBlock.populateModel(); }
}
}
diff --git a/apps/com.pelagicore.phone/Main.qml b/apps/com.pelagicore.phone/Main.qml
index 25d5bb10..2fda4a84 100644
--- a/apps/com.pelagicore.phone/Main.qml
+++ b/apps/com.pelagicore.phone/Main.qml
@@ -88,8 +88,11 @@ ApplicationCCWindow {
visible: opacity > 0
anchors.fill: fullscreenTopPartBackground
callerHandle: phone.callerHandle
+ enableOpacityMasks: store.allowOpenGLContent
}
+ PhoneStore { id: store; onRequestRaiseAppReceived: root.riseWindow(); }
+
PhoneView {
id: phone
x: root.exposedRect.x
@@ -98,6 +101,6 @@ ApplicationCCWindow {
height: (root.exposedRect.height + root.exposedRect.y)
state: root.neptuneState
onActivateApp: root.riseWindow()
- store: PhoneStore {}
+ store: store
}
}
diff --git a/apps/com.pelagicore.phone/controls/BlurredImageBackground.qml b/apps/com.pelagicore.phone/controls/BlurredImageBackground.qml
index 11afab30..a4b5a3aa 100644
--- a/apps/com.pelagicore.phone/controls/BlurredImageBackground.qml
+++ b/apps/com.pelagicore.phone/controls/BlurredImageBackground.qml
@@ -39,13 +39,14 @@ Item {
id: root
property string callerHandle: ""
+ property bool enableOpacityMasks
Image {
id: contactImage
anchors.fill: parent
source: (root.callerHandle !== "") ? "../assets/profile_photos/%1.png".arg(root.callerHandle) : ""
fillMode: Image.PreserveAspectCrop
- visible: false
+ visible: !root.enableOpacityMasks
}
FastBlur {
diff --git a/apps/com.pelagicore.phone/controls/RoundImage.qml b/apps/com.pelagicore.phone/controls/RoundImage.qml
index 3fc9ae55..f11486a2 100644
--- a/apps/com.pelagicore.phone/controls/RoundImage.qml
+++ b/apps/com.pelagicore.phone/controls/RoundImage.qml
@@ -41,6 +41,7 @@ ToolButton {
implicitWidth: Sizes.dp(img.sourceSize.width)
implicitHeight: Sizes.dp(img.sourceSize.height)
+ property bool enableOpacityMasks
property alias source: img.source
background: Rectangle {
@@ -53,7 +54,7 @@ ToolButton {
id: img
anchors.fill: mask
fillMode: Image.PreserveAspectCrop
- layer.enabled: true
+ layer.enabled: root.enableOpacityMasks
layer.effect: OpacityMask {
maskSource: mask
}
diff --git a/apps/com.pelagicore.phone/controls/WidgetContact.qml b/apps/com.pelagicore.phone/controls/WidgetContact.qml
index 57d2f981..9f0a6cf7 100644
--- a/apps/com.pelagicore.phone/controls/WidgetContact.qml
+++ b/apps/com.pelagicore.phone/controls/WidgetContact.qml
@@ -48,6 +48,7 @@ Control {
property alias source: contactImage.source
property bool lastItem: false
property bool maximized: false
+ property bool enableOpacityMasks
signal callWidgetClicked(var handle)
background: Image {
@@ -78,6 +79,7 @@ Control {
anchors.verticalCenter: parent.verticalCenter
opacity: 1
enabled: false
+ enableOpacityMasks: root.enableOpacityMasks
}
Column {
@@ -105,6 +107,10 @@ Control {
}
}
+ MouseArea {
+ anchors.fill: parent
+ }
+
ToolButton {
anchors.right: parent.right
anchors.rightMargin: Sizes.dp(69)
diff --git a/apps/com.pelagicore.phone/info.yaml b/apps/com.pelagicore.phone/info.yaml
index 30c41051..0743f8fc 100644
--- a/apps/com.pelagicore.phone/info.yaml
+++ b/apps/com.pelagicore.phone/info.yaml
@@ -1,10 +1,8 @@
formatVersion: 1
-formatType: am-application
+formatType: am-package
---
id: 'com.pelagicore.phone'
icon: 'icon.png'
-code: 'Main.qml'
-runtime: 'qml'
name:
en: 'Phone'
de: 'Telefon'
@@ -14,8 +12,14 @@ name:
ja: '電話'
ko: '전화'
+applications:
+- id: 'com.pelagicore.phone'
+ code: 'Main.qml'
+ runtime: 'qml'
+ applicationProperties: { private: { squishPort: 7728 } }
+
intents:
- id: call-support
+- id: activate-app
-applicationProperties: { private: { squishPort: 7728 } }
categories: [ 'phone', 'widget' ]
diff --git a/apps/com.pelagicore.phone/stores/PhoneStore.qml b/apps/com.pelagicore.phone/stores/PhoneStore.qml
index 05f6a3cb..da305fe2 100644
--- a/apps/com.pelagicore.phone/stores/PhoneStore.qml
+++ b/apps/com.pelagicore.phone/stores/PhoneStore.qml
@@ -34,6 +34,7 @@
import QtQuick 2.8
import QtApplicationManager.Application 2.0
import shared.utils 1.0
+import shared.com.pelagicore.systeminfo 1.0
Store {
id: root
@@ -41,17 +42,29 @@ Store {
property bool ongoingCall: false
property string callerHandle: ""
property alias callDuration: callTimer.duration
+ readonly property SystemInfo systemInfo: SystemInfo {}
+ readonly property bool allowOpenGLContent: systemInfo.allowOpenGLContent
//! [parking intent handler]
readonly property IntentHandler intentHandler: IntentHandler {
- intentIds: "call-support"
+ intentIds: ["call-support", "activate-app"]
onRequestReceived: {
- root.startCall("neptunesupport");
- request.sendReply({ "done": true });
+ switch (request.intentId) {
+ case "call-support":
+ root.startCall("neptunesupport");
+ request.sendReply({ "done": true });
+ break;
+ case "activate-app":
+ root.requestRaiseAppReceived()
+ request.sendReply({ "done": true })
+ break;
+ }
}
}
//! [parking intent handler]
+ signal requestRaiseAppReceived()
+
function findPerson(handle) {
for (var i = 0; i < contactsModel.count; i++) {
var item = contactsModel.get(i);
diff --git a/apps/com.pelagicore.phone/views/CallWidgetView.qml b/apps/com.pelagicore.phone/views/CallWidgetView.qml
index a673c648..eeb69b94 100644
--- a/apps/com.pelagicore.phone/views/CallWidgetView.qml
+++ b/apps/com.pelagicore.phone/views/CallWidgetView.qml
@@ -161,6 +161,7 @@ Item {
RoundImage {
id: contactImage
source: root.callerHandle ? "../assets/profile_photos/%1.png".arg(root.callerHandle) : ""
+ enableOpacityMasks: store.allowOpenGLContent
}
ColumnLayout {
diff --git a/apps/com.pelagicore.phone/views/ContactsView.qml b/apps/com.pelagicore.phone/views/ContactsView.qml
index d78536f5..09a64269 100644
--- a/apps/com.pelagicore.phone/views/ContactsView.qml
+++ b/apps/com.pelagicore.phone/views/ContactsView.qml
@@ -65,6 +65,7 @@ ListView {
Layout.preferredHeight: Sizes.dp(64)
Layout.preferredWidth: Sizes.dp(64)
source: "../assets/profile_photos/%1.png".arg(model.handle)
+ enableOpacityMasks: store.allowOpenGLContent
leftPadding: Sizes.dp(16)
rightPadding: Sizes.dp(16)
}
diff --git a/apps/com.pelagicore.phone/views/FavoritesWidgetView.qml b/apps/com.pelagicore.phone/views/FavoritesWidgetView.qml
index e9dd18d8..d4ab3ee4 100644
--- a/apps/com.pelagicore.phone/views/FavoritesWidgetView.qml
+++ b/apps/com.pelagicore.phone/views/FavoritesWidgetView.qml
@@ -125,6 +125,7 @@ Item {
lastItem: (index === (favorites1Row.model.count - 1))
maximized: (root.state === "Maximized")
onCallWidgetClicked: { root.store.startCall(handle); }
+ enableOpacityMasks: store.allowOpenGLContent
}
PageIndicator {
anchors.verticalCenter: parent.bottom
@@ -189,6 +190,7 @@ Item {
Layout.preferredWidth: Sizes.dp(64)
Layout.alignment: Qt.AlignVCenter
source: "../assets/profile_photos/%1.png".arg(model.handle)
+ enableOpacityMasks: store.allowOpenGLContent
}
Label {
objectName: "shortCallName"
diff --git a/apps/com.pelagicore.phone/views/RecentCallsView.qml b/apps/com.pelagicore.phone/views/RecentCallsView.qml
index dad9dfe1..72554627 100644
--- a/apps/com.pelagicore.phone/views/RecentCallsView.qml
+++ b/apps/com.pelagicore.phone/views/RecentCallsView.qml
@@ -75,6 +75,7 @@ ListView {
Layout.preferredHeight: Sizes.dp(64)
Layout.preferredWidth: Sizes.dp(64)
source: "../assets/profile_photos/%1.png".arg(model.peerHandle)
+ enableOpacityMasks: store.allowOpenGLContent
leftPadding: Sizes.dp(16)
rightPadding: Sizes.dp(16)
}
diff --git a/apps/com.pelagicore.tuner/info.yaml b/apps/com.pelagicore.tuner/info.yaml
index 19833c44..2a5aec0a 100644
--- a/apps/com.pelagicore.tuner/info.yaml
+++ b/apps/com.pelagicore.tuner/info.yaml
@@ -1,15 +1,18 @@
formatVersion: 1
-formatType: am-application
+formatType: am-package
---
id: 'com.pelagicore.tuner'
icon: 'icon.png'
-code: 'Main.qml'
-runtime: 'qml'
name:
en: 'Tuner'
de: 'Tuner'
-applicationProperties: { private: { squishPort: 7731 } }
+applications:
+ - id: 'com.pelagicore.tuner'
+ code: 'Main.qml'
+ runtime: 'qml'
+ applicationProperties: { private: { squishPort: 7731 } }
+
categories: [ 'media' ]
intents:
- id: activate-app
diff --git a/apps/com.pelagicore.tuner/popups/MusicSourcesPopup.qml b/apps/com.pelagicore.tuner/popups/MusicSourcesPopup.qml
index 08db5223..4fa862c9 100644
--- a/apps/com.pelagicore.tuner/popups/MusicSourcesPopup.qml
+++ b/apps/com.pelagicore.tuner/popups/MusicSourcesPopup.qml
@@ -54,7 +54,8 @@ PopupWindow {
Item {
id: popupContent
- anchors.fill: parent
+ width: root.width
+ height: root.height
Label {
id: header
diff --git a/apps/com.pelagicore.tuner/stores/TunerStore.qml b/apps/com.pelagicore.tuner/stores/TunerStore.qml
index 4e5c18e9..f05892e7 100644
--- a/apps/com.pelagicore.tuner/stores/TunerStore.qml
+++ b/apps/com.pelagicore.tuner/stores/TunerStore.qml
@@ -82,11 +82,11 @@ Store {
property ListModel musicSourcesModel: ListModel {
id: musicSourcesModel
ListElement {
- text: "AM/FM Radio"
+ text: qsTr("AM/FM Radio")
appId: "com.pelagicore.tuner"
}
ListElement {
- text: "Music"
+ text: qsTr("Music")
appId: "com.pelagicore.music"
}
}
diff --git a/apps/com.pelagicore.tuner/views/FullScreenBottomView.qml b/apps/com.pelagicore.tuner/views/FullScreenBottomView.qml
index 59b5813d..348ad3dd 100644
--- a/apps/com.pelagicore.tuner/views/FullScreenBottomView.qml
+++ b/apps/com.pelagicore.tuner/views/FullScreenBottomView.qml
@@ -58,11 +58,28 @@ Item {
currentIndex: 1
onClicked: {
if (currentText === "sources") {
- var pos = currentItem.mapToItem(root.rootItem, currentItem.width/2, currentItem.height/2);
//set model each time to ensure data accuracy
musicSourcesPopup.model = root.store.musicSourcesModel;
- musicSourcesPopup.originItemX = pos.x;
- musicSourcesPopup.originItemY = pos.y;
+
+ let pos = currentItem.mapToItem(root.rootItem
+ , currentItem.width / 2
+ , currentItem.height / 2);
+ let posX = pos.x / root.Sizes.scale;
+ let posY = pos.y / root.Sizes.scale;
+ // caclulate popup height based on musicSources list items
+ // + 200 for header & margins
+ musicSourcesPopup.height = Qt.binding(() => {
+ return musicSourcesPopup.model
+ ? root.Sizes.dp(200 + (musicSourcesPopup.model.count * 96))
+ : root.Sizes.dp(296);
+ });
+ musicSourcesPopup.width = Qt.binding(() => root.Sizes.dp(910))
+ musicSourcesPopup.originItemX = Qt.binding(() => root.Sizes.dp(posX));
+ musicSourcesPopup.originItemY = Qt.binding(() => root.Sizes.dp(posY));
+ musicSourcesPopup.popupY = Qt.binding(() => {
+ return root.Sizes.dp(Config.centerConsoleHeight / 4);
+ });
+
musicSourcesPopup.visible = true;
} else if (currentText === "FM 1 band") {
root.store.freqPresets = 1;
@@ -76,11 +93,7 @@ Item {
MusicSourcesPopup {
id: musicSourcesPopup
- width: root.Sizes.dp(910)
- // caclulate popup height based on musicSources list items
- // + 200 for header & margins
- height: model ? root.Sizes.dp(200 + (model.count * 96)) : root.Sizes.dp(296)
- popupY: root.Sizes.dp(Config.centerConsoleHeight / 4)
+
onSwitchSourceClicked: {
store.switchSource(source)
}
diff --git a/apps/com.theqtcompany.cluster/Main.qml b/apps/com.theqtcompany.cluster/Main.qml
index 69aa0a30..2f9db8c3 100644
--- a/apps/com.theqtcompany.cluster/Main.qml
+++ b/apps/com.theqtcompany.cluster/Main.qml
@@ -48,10 +48,11 @@ NeptuneWindow {
visible: true
title: qsTr("Instrument Cluster")
+ width: Sizes.dp(Config.instrumentClusterWidth)
+ height: root.width / Config.instrumentClusterUIAspectRatio
+
Component.onCompleted: {
setWindowProperty("windowType", "instrumentcluster");
- root.width = Sizes.dp(Config.instrumentClusterWidth)
- root.height = root.width / Config.instrumentClusterUIAspectRatio
}
ClusterView {
@@ -82,4 +83,11 @@ NeptuneWindow {
}
}
}
+
+ onWindowPropertyChanged: {
+ if (name === "clusterUIMode") {
+ //set UI mode for cluster: no app or some app running under cluster view
+ clusterView.store.behaviourInterface.clusterUIMode = value
+ }
+ }
}
diff --git a/apps/com.theqtcompany.cluster/assets/+lucee/ic-battery.png b/apps/com.theqtcompany.cluster/assets/+lucee/ic-battery.png
new file mode 100644
index 00000000..25cdce07
--- /dev/null
+++ b/apps/com.theqtcompany.cluster/assets/+lucee/ic-battery.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9d9bcdf7c6183977ef4517eced3db3afa6c810957606e9db66e7dcb0585d37f8
+size 993
diff --git a/apps/com.theqtcompany.cluster/assets/+lucee/ic-distance.png b/apps/com.theqtcompany.cluster/assets/+lucee/ic-distance.png
new file mode 100644
index 00000000..ca38becf
--- /dev/null
+++ b/apps/com.theqtcompany.cluster/assets/+lucee/ic-distance.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:06722f864a20d176bdafd8c25c4c40ba30c293c3177168a313e30966a59e8dce
+size 2267
diff --git a/apps/com.theqtcompany.cluster/assets/3dGauges/gauges.uia b/apps/com.theqtcompany.cluster/assets/3dGauges/gauges.uia
index ac12ef7a..ac554f0e 100644
--- a/apps/com.theqtcompany.cluster/assets/3dGauges/gauges.uia
+++ b/apps/com.theqtcompany.cluster/assets/3dGauges/gauges.uia
@@ -1,26 +1,26 @@
<?xml version='1.0' encoding='UTF-8'?>
<application>
<assets initial="gauges">
- <presentation src="presentations/gauges.uip" id="gauges"/>
- <dataInput name="darkThemeVisible" type="Boolean"/>
- <dataInput name="gaugesScale" type="Vector3"/>
- <dataInput name="lightThemeVisible" type="Boolean"/>
- <dataInput name="mainLightColor" type="Variant"/>
- <dataInput name="mainPanelOpacity" type="Float"/>
- <dataInput name="rpmGaugePosition" type="Vector3"/>
- <dataInput name="rpmGaugeRotation" type="Vector3"/>
- <dataInput name="rpmVectorQml" type="Vector3"/>
- <dataInput name="speedGaugePosition" type="Vector3"/>
- <dataInput name="speedGaugeRotation" type="Vector3"/>
- <dataInput name="speedLimitObjectVisible" type="Boolean"/>
- <dataInput name="speedLimitText" type="Float"/>
- <dataInput name="speedVectorQml" type="Vector3"/>
+ <presentation id="gauges" src="presentations/gauges.uip"/>
+ <dataInput metadata="" name="darkThemeVisible" type="Boolean"/>
+ <dataInput metadata="" name="gaugesScale" type="Vector3"/>
+ <dataInput metadata="" name="lightThemeVisible" type="Boolean"/>
+ <dataInput metadata="" name="mainLightColor" type="Vector4"/>
+ <dataInput metadata="" name="mainPanelOpacity" type="Float"/>
+ <dataInput metadata="" name="rpmGaugePosition" type="Vector3"/>
+ <dataInput metadata="" name="rpmGaugeRotation" type="Vector3"/>
+ <dataInput metadata="" name="rpmVectorQml" type="Vector3"/>
+ <dataInput metadata="" name="speedGaugePosition" type="Vector3"/>
+ <dataInput metadata="" name="speedGaugeRotation" type="Vector3"/>
+ <dataInput metadata="" name="speedLimitObjectVisible" type="Boolean"/>
+ <dataInput metadata="" name="speedLimitText" type="Float"/>
+ <dataInput metadata="" name="speedVectorQml" type="Vector3"/>
</assets>
<statemachine ref="#logic">
<visual-states>
<state ref="Initial">
<enter>
- <goto-slide element="main:Scene" rel="next"/>
+ <goto-slide rel="next" element="main:Scene"/>
</enter>
</state>
</visual-states>
diff --git a/apps/com.theqtcompany.cluster/assets/3dGauges/maps/gradient_lines_001-w.png b/apps/com.theqtcompany.cluster/assets/3dGauges/maps/gradient_lines_001-w.png
index 32e5c044..1ee26188 100644
--- a/apps/com.theqtcompany.cluster/assets/3dGauges/maps/gradient_lines_001-w.png
+++ b/apps/com.theqtcompany.cluster/assets/3dGauges/maps/gradient_lines_001-w.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:acd026789462a35cd7b63d0a80ed5c97c6bebba39cdc42880e1ace3b63b6d5f9
-size 268208
+oid sha256:c2afdb40954fd62e4f688141e95d6237763abb22527861f7fef49fa107ab3329
+size 334140
diff --git a/apps/com.theqtcompany.cluster/assets/3dGauges/presentations/gauges.uip b/apps/com.theqtcompany.cluster/assets/3dGauges/presentations/gauges.uip
index a7ffac7a..ec2b1d42 100644
--- a/apps/com.theqtcompany.cluster/assets/3dGauges/presentations/gauges.uip
+++ b/apps/com.theqtcompany.cluster/assets/3dGauges/presentations/gauges.uip
@@ -1,351 +1,313 @@
<?xml version="1.0" encoding="UTF-8" ?>
-<UIP version="3" >
- <Project >
- <ProjectSettings author="" company="" presentationWidth="1280" presentationHeight="480" maintainAspect="False" preferKtx="False" >
- <CustomColors count="16" >#ff902f #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff</CustomColors>
- </ProjectSettings>
- <BufferData >
- <ImageBuffer sourcepath="../maps/Glass-alpha05.png" hasTransparency="True" />
- <ImageBuffer sourcepath="../maps/Rpm7-w.png" hasTransparency="True" />
- <ImageBuffer sourcepath="../maps/Rpm7.png" hasTransparency="True" />
- <ImageBuffer sourcepath="../maps/kmh260-w.png" hasTransparency="True" />
- <ImageBuffer sourcepath="../maps/kmh260.png" hasTransparency="True" />
- <ImageBuffer sourcepath="../models/roundbg_1/maps/gradient.png" hasTransparency="True" />
- </BufferData>
- <Graph >
- <Scene id="Scene" backgroundcolor="0.27451 0.27451 0.27451" bgcolorenable="False" controlledproperty="" >
- <Layer id="Cluster3D2" >
- <Camera id="Camera_002" >
- <Light id="DangerLight" />
- <Light id="Light2" />
- <Light id="MainLight2" />
- </Camera>
- <Group id="Cluster_001" >
- <Group id="MainGauges" >
- <Group id="LeftGauge_001" >
- <Group id="gauges" importid="__import__root__" orientation="Right Handed" position="0 0 -0" rotation="-90 -0 0" rotationorder="XYZr" scale="1 1 1" >
- <Model id="Automotive_Gauges" name="Automotive_Gauges" importid="Automotive_Gauges" orientation="Right Handed" position="2.13057 0.118131 -0.124425" rotation="0 -0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/gauges/meshes/Automotive_Gauges.mesh" >
- <ReferencedMaterial id="Material_002" />
- </Model>
- <Model id="glass1" name="glass1" importid="glass1" orientation="Right Handed" position="0.632279 0.11815 -0.124416" rotation="0 -0 0" rotationorder="XYZr" scale="1.02503 1.02503 1.02503" sourcepath="../models/gauges/meshes/glass1.mesh" >
- <ReferencedMaterial id="Material_001_animatable" />
- </Model>
- </Group>
- <Model id="SpeedLimitObject" >
- <Model id="Cylinder" >
- <Material id="Default_animatable" />
- <Text id="SpeedLimit" />
- </Model>
- <Material id="Default" />
- </Model>
- <Group id="GaugeBackground" >
- <Group id="roundbg_1" importid="__import__root__" >
- <Model id="qt_gauge_background_round_1" name="qt_gauge_background_round_1" importid="qt_gauge_background_round_1" orientation="Right Handed" position="0 0 -0" rotation="0 -0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/roundbg_1/meshes/qt_gauge_background_round_1.mesh" >
- <Material id="background_1" name="background_1" blendmode="Normal" diffuse="1 1 1" diffusemap="#background_1_diffusemap" emissivepower="0" importid="background_1" opacity="100" specularamount="0" >
- <Image id="background_1_diffusemap" name="background_1_diffusemap" importid="background_1_diffusemap" sourcepath="../models/roundbg_1/maps/gradient.png" />
- <Image id="background_1_specularreflection" />
- </Material>
- </Model>
- </Group>
- <Group id="roundbg_1_002" importid="__import__root__" >
- <Model id="qt_gauge_background_round_1_002" name="qt_gauge_background_round_1" importid="qt_gauge_background_round_1" orientation="Right Handed" position="0 0 -0" rotation="0 -0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/roundbg_1/meshes/qt_gauge_background_round_1.mesh" >
- <Material id="background_1_002" name="background_1" blendmode="Normal" diffuse="1 1 1" diffusemap="#background_1_002_diffusemap" emissivepower="0" importid="background_1" opacity="100" specularamount="0" >
- <Image id="background_1_002_diffusemap" name="background_1_diffusemap" importid="background_1_diffusemap" sourcepath="../models/roundbg_1/maps/gradient.png" />
- <Image id="background_1_002_specularreflection" />
- </Material>
- </Model>
- </Group>
- <Group id="Ring_2" importid="__import__root__" >
- <Model id="qt_gauge_ring_2" name="qt_gauge_ring_2" importid="qt_gauge_ring_2" orientation="Right Handed" position="0 0 -0" rotation="0 -0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/Ring_2/meshes/qt_gauge_ring_2.mesh" >
- <Material id="Default_white" name="Default_white" blendmode="Normal" diffuse="1 1 1" emissivepower="0" importid="Default_white" opacity="100" specularamount="0" >
- <Image id="Default_white_specularreflection" />
- </Material>
- </Model>
- </Group>
- </Group>
- <Component id="GaugeNeedle" >
- <Group id="GaugeNeedle_001" >
- <Group id="needle_2" importid="__import__root__" >
- <Model id="qt_gauge_needles_2" name="qt_gauge_needles_2" importid="qt_gauge_needles_2" orientation="Right Handed" position="0 0 -0" rotation="0 -0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/needle_2/meshes/qt_gauge_needles_2.mesh" >
- <Material id="qt_gauge_needles:red_transparent" name="qt_gauge_needles:red_transparent" blendmode="Normal" diffuse="1 1 1" emissivepower="0" importid="qt_gauge_needles:red_transparent" opacity="100" specularamount="0" />
- <Material id="qt_gauge_needles:black_solid" name="qt_gauge_needles:black_solid" blendmode="Normal" diffuse="1 1 1" emissivepower="0" importid="qt_gauge_needles:black_solid" opacity="100" specularamount="0" />
- <Material id="qt_gauge_needles:solidWhite" name="qt_gauge_needles:solidWhite" blendmode="Normal" diffuse="1 1 1" emissivepower="0" importid="qt_gauge_needles:solidWhite" opacity="100" specularamount="0" >
- <Image id="qt_gauge_needles:solidWhite_specularreflection" />
- </Material>
- </Model>
- <Light id="gaugesLight" />
- </Group>
- </Group>
- </Component>
- <Group id="GaugeTickmarks" >
- <Group id="tickmark_260_001" importid="__import__root__" >
- <Model id="qt_gauge_tickmarks_260_001" name="qt_gauge_tickmarks_260" importid="qt_gauge_tickmarks_260" orientation="Right Handed" position="0 0 -0" rotation="0 -0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/tickmark_260/meshes/qt_gauge_tickmarks_260.mesh" >
- <Material id="black_tickmarks" />
- </Model>
- </Group>
- <Group id="tickmark_260" importid="__import__root__" >
- <Model id="qt_gauge_tickmarks_260" name="qt_gauge_tickmarks_260" importid="qt_gauge_tickmarks_260" orientation="Right Handed" position="0 0 -0" rotation="0 -0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/tickmark_260/meshes/qt_gauge_tickmarks_260.mesh" >
- <Material id="Default_white_001" name="Default_white" blendmode="Normal" diffuse="1 1 1" emissivepower="0" importid="Default_white" opacity="100" specularamount="0" />
- </Model>
- </Group>
- </Group>
- <Group id="GaugeNumbers" >
- <Model id="kmh260_001" >
- <Material id="Material" >
- <Image id="Material_diffusemap" />
- </Material>
- </Model>
- <Model id="kmh260" >
- <Material id="Material_003" >
- <Image id="Material_003_diffusemap" />
- </Material>
- </Model>
- </Group>
- </Group>
- <Group id="RightGauge_001" >
- <Group id="gauges_001" importid="__import__root__" orientation="Right Handed" position="0 0 -0" rotation="-90 -0 0" rotationorder="XYZr" scale="1 1 1" >
- <Model id="Automotive_Gauges_001" name="Automotive_Gauges" importid="Automotive_Gauges" orientation="Right Handed" position="2.13057 0.118131 -0.124425" rotation="0 -0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/gauges/meshes/Automotive_Gauges.mesh" >
- <Material id="white_animatable" >
- <Image id="white_animatable_specularreflection" />
- </Material>
- </Model>
- <Model id="glass1_001" name="glass1" importid="glass1" orientation="Right Handed" position="0.632279 0.11815 -0.124416" rotation="0 -0 0" rotationorder="XYZr" scale="1.02503 1.02503 1.02503" sourcepath="../models/gauges/meshes/glass1.mesh" >
- <Material id="Material_001_animatable_001" >
- <Image id="Material_001_animatable_001_specularmap" />
- <Image id="Material_001_animatable_001_diffusemap" />
- </Material>
- </Model>
- </Group>
- <Group id="GaugeBackground_001" >
- <Group id="roundbg_1_003" importid="__import__root__" >
- <Model id="qt_gauge_background_round_1_003" name="qt_gauge_background_round_1" importid="qt_gauge_background_round_1" orientation="Right Handed" position="0 0 -0" rotation="0 -0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/roundbg_1/meshes/qt_gauge_background_round_1.mesh" >
- <Material id="background_1_003" name="background_1" blendmode="Normal" diffuse="1 1 1" diffusemap="#background_1_003_diffusemap" emissivepower="0" importid="background_1" opacity="100" specularamount="0" >
- <Image id="background_1_003_diffusemap" name="background_1_diffusemap" importid="background_1_diffusemap" sourcepath="../models/roundbg_1/maps/gradient.png" />
- <Image id="background_1_003_specularreflection" />
- </Material>
- </Model>
- </Group>
- <Group id="roundbg_1_001" importid="__import__root__" >
- <Model id="qt_gauge_background_round_1_001" name="qt_gauge_background_round_1" importid="qt_gauge_background_round_1" orientation="Right Handed" position="0 0 -0" rotation="0 -0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/roundbg_1/meshes/qt_gauge_background_round_1.mesh" >
- <Material id="background_1_001" name="background_1" blendmode="Normal" diffuse="1 1 1" diffusemap="#background_1_001_diffusemap" emissivepower="0" importid="background_1" opacity="100" specularamount="0" >
- <Image id="background_1_001_diffusemap" name="background_1_diffusemap" importid="background_1_diffusemap" sourcepath="../models/roundbg_1/maps/gradient.png" />
- <Image id="background_1_001_specularreflection" />
- </Material>
- </Model>
- </Group>
- <Group id="Ring_2_001" importid="__import__root__" >
- <Model id="qt_gauge_ring_2_001" name="qt_gauge_ring_2" importid="qt_gauge_ring_2" orientation="Right Handed" position="0 0 -0" rotation="0 -0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/Ring_2/meshes/qt_gauge_ring_2.mesh" >
- <Material id="Default_white_002" name="Default_white" blendmode="Normal" diffuse="1 1 1" emissivepower="0" importid="Default_white" opacity="100" specularamount="0" >
- <Image id="Default_white_002_specularreflection" />
- </Material>
- </Model>
- </Group>
- </Group>
- <Component id="GaugeNeedle_002" >
- <Group id="GaugeNeedle_003" >
- <Group id="needle_2_001" importid="__import__root__" >
- <Light id="LightGagugesRight" />
- <Model id="qt_gauge_needles_2_001" name="qt_gauge_needles_2" importid="qt_gauge_needles_2" orientation="Right Handed" position="0 0 -0" rotation="0 -0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/needle_2/meshes/qt_gauge_needles_2.mesh" >
- <Material id="qt_gauge_needles:red_transparent_001" name="qt_gauge_needles:red_transparent" blendmode="Normal" diffuse="1 1 1" emissivepower="0" importid="qt_gauge_needles:red_transparent" opacity="100" specularamount="0" />
- <Material id="qt_gauge_needles:black_solid_001" name="qt_gauge_needles:black_solid" blendmode="Normal" diffuse="1 1 1" emissivepower="0" importid="qt_gauge_needles:black_solid" opacity="100" specularamount="0" />
- <Material id="qt_gauge_needles:solidWhite_001" name="qt_gauge_needles:solidWhite" blendmode="Normal" diffuse="1 1 1" emissivepower="0" importid="qt_gauge_needles:solidWhite" opacity="100" specularamount="0" >
- <Image id="qt_gauge_needles:solidWhite_001_specularreflection" />
- </Material>
- </Model>
- </Group>
- </Group>
- </Component>
- <Group id="GaugeTickmarks_001" >
- <Group id="tickmark_8_small" importid="__import__root__" >
- <Model id="qt_gauge_tickmarks_8_small" name="qt_gauge_tickmarks_8_small" importid="qt_gauge_tickmarks_8_small" orientation="Right Handed" position="0 0 -0" rotation="0 -0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/tickmark_8_small/meshes/qt_gauge_tickmarks_8_small.mesh" >
- <Material id="Default_white_003" name="Default_white" blendmode="Normal" diffuse="1 1 1" emissivepower="0" importid="Default_white" opacity="100" specularamount="0" />
- </Model>
- </Group>
- <Group id="tickmark_8_small_001" importid="__import__root__" >
- <Model id="qt_gauge_tickmarks_8_small_001" name="qt_gauge_tickmarks_8_small" importid="qt_gauge_tickmarks_8_small" orientation="Right Handed" position="0 0 -0" rotation="0 -0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/tickmark_8_small/meshes/qt_gauge_tickmarks_8_small.mesh" >
- <Material id="Default_black" />
- </Model>
- </Group>
- </Group>
- <Group id="GaugeNumbers_001" >
- <Model id="Rpm7_001" >
- <Material id="Material_001" >
- <Image id="Material_001_diffusemap" />
- </Material>
- </Model>
- <Model id="Rpm7" >
- <Material id="Material_004" >
- <Image id="Material_004_diffusemap" />
- </Material>
- </Model>
- </Group>
- <Group id="GaugeText_001" />
- </Group>
- </Group>
- </Group>
- </Layer>
- </Scene>
- </Graph>
- <Logic >
- <State name="Master Slide" component="#Scene" >
- <Add ref="#Cluster3D2" name="Cluster3D" aodither="False" aosamplerate="3" aostrength="0" background="Transparent" backgroundcolor="1 1 1" height="100" heightunits="percent" leftunits="percent" multisampleaa="SSAA" probe2fade="1" probebright="231" probefov="169.26" probehorizon="-1" progressiveaa="8x" temporalaa="False" width="100" widthunits="percent" />
- <Add ref="#Camera_002" fov="8.16" orthographic="False" position="0 0 -395" rotation="0 0 0" />
- <Add ref="#Cluster_001" name="Cluster" controlledproperty="$mainPanelOpacity opacity" position="1 -2.5 0" />
- <Add ref="#MainGauges" name="MainGauges" locked="False" position="0 0.268 -1.522" rotation="0 0 0" />
- <Add ref="#LeftGauge_001" name="LeftGauge" controlledproperty="$gaugesScale scale $speedGaugeRotation rotation $speedGaugePosition position" locked="False" pivot="0 0 0" position="-52 0 0" rotation="-60 -30 0" scale="1.7 1.7 1.7" />
- <Add ref="#GaugeBackground" name="GaugeBackground" controlledproperty="" locked="False" position="0 0 0" scale="1 5 1" />
- <Add ref="#roundbg_1" name="roundbg_1" controlledproperty="$darkThemeVisible eyeball" importfile="models/roundbg_1/roundbg_1.import" locked="False" position="0 -0.01 0" scale="0.89 0.9 0.89" sourcepath="../models/roundbg_1/roundbg_1.import" />
- <Add ref="#qt_gauge_background_round_1" controlledproperty="$darkThemeVisible eyeball" importfile="models/roundbg_1/roundbg_1.import" locked="False" />
- <Add ref="#background_1" bumpamount="1" importfile="models/roundbg_1/roundbg_1.import" ior="0.18" locked="False" specularamount="0.5" specularreflection="#background_1_specularreflection" specularroughness="0.321" />
- <Add ref="#background_1_diffusemap" importfile="models/roundbg_1/roundbg_1.import" locked="False" sourcepath="../maps/gradient_lines_001.png" />
- <Add ref="#background_1_specularreflection" locked="False" mappingmode="Environmental Mapping" sourcepath="../maps/OpenfootageNET_garage-512.hdr" />
- <Add ref="#Ring_2" name="Ring_2" controlledproperty="" importfile="models/Ring_2/Ring_2.import" locked="False" position="0 -0.05 0" scale="1 1.2 1" sourcepath="../models/Ring_2/Ring_2.import" />
- <Add ref="#qt_gauge_ring_2" controlledproperty="" importfile="models/Ring_2/Ring_2.import" locked="False" />
- <Add ref="#Default_white" diffuse="0.0980392 0.0980392 0.0980392" importfile="models/Ring_2/Ring_2.import" locked="False" specularamount="1" specularreflection="#Default_white_specularreflection" />
- <Add ref="#Default_white_specularreflection" locked="False" mappingmode="Environmental Mapping" sourcepath="../maps/OpenfootageNET_garage-512.hdr" />
- <Add ref="#GaugeNeedle" name="GaugeNeedle" controlledproperty="" locked="False" position="0 -2.5 0" />
- <Add ref="#GaugeTickmarks" name="GaugeTickmarks" controlledproperty="" locked="False" />
- <Add ref="#tickmark_260" name="tickmark_260" controlledproperty="$darkThemeVisible eyeball" importfile="models/tickmark_260/tickmark_260.import" locked="False" sourcepath="../models/tickmark_260/tickmark_260.import" />
- <Add ref="#qt_gauge_tickmarks_260" importfile="models/tickmark_260/tickmark_260.import" locked="False" />
- <Add ref="#Default_white_001" diffuse="1 1 1" importfile="models/tickmark_260/tickmark_260.import" locked="False" />
- <Add ref="#GaugeNumbers" name="GaugeNumbers" controlledproperty="" locked="False" position="0.597784 2 0.170977" rotation="90 0 0" scale="0.17 0.17 0.17" />
- <Add ref="#kmh260" name="kmh260" controlledproperty="$darkThemeVisible eyeball" locked="False" position="1.52588e-05 -3.8147e-06 11.4355" rotation="0 0 0" scale="1.024 1.024 1" sourcepath="#Rectangle" />
- <Add ref="#Material_003" bumpamount="0.5" controlledproperty="" diffusemap="#Material_003_diffusemap" emissivepower="0" locked="False" shaderlighting="None" />
- <Add ref="#Material_003_diffusemap" locked="False" sourcepath="../maps/kmh260.png" />
- <Add ref="#RightGauge_001" name="RightGauge" controlledproperty="$gaugesScale scale $rpmGaugeRotation rotation $rpmGaugePosition position" locked="False" position="48 0 0" rotation="-60 30 0" scale="1.7 1.7 1.7" />
- <Add ref="#GaugeBackground_001" name="GaugeBackground" locked="False" position="0 0 0" scale="1 5 1" />
- <Add ref="#roundbg_1_001" name="roundbg_1" controlledproperty="$darkThemeVisible eyeball" importfile="models/roundbg_1/roundbg_1.import" locked="False" position="0 -0.01 0" scale="0.89 0.9 0.89" sourcepath="../models/roundbg_1/roundbg_1.import" />
- <Add ref="#qt_gauge_background_round_1_001" controlledproperty="$darkThemeVisible eyeball" importfile="models/roundbg_1/roundbg_1.import" locked="False" />
- <Add ref="#background_1_001" bumpamount="1" importfile="models/roundbg_1/roundbg_1.import" ior="0.19" locked="False" specularamount="0.5" specularreflection="#background_1_001_specularreflection" specularroughness="0.31069" />
- <Add ref="#background_1_001_diffusemap" importfile="models/roundbg_1/roundbg_1.import" locked="False" sourcepath="../maps/gradient_lines_001.png" />
- <Add ref="#background_1_001_specularreflection" locked="False" mappingmode="Environmental Mapping" sourcepath="../maps/OpenfootageNET_garage-512.hdr" />
- <Add ref="#Ring_2_001" name="Ring_2" importfile="models/Ring_2/Ring_2.import" locked="False" position="0 -0.05 0" scale="1 1.2 1" sourcepath="../models/Ring_2/Ring_2.import" />
- <Add ref="#qt_gauge_ring_2_001" controlledproperty="" importfile="models/Ring_2/Ring_2.import" locked="False" />
- <Add ref="#Default_white_002" diffuse="0.0980392 0.0980392 0.0980392" importfile="models/Ring_2/Ring_2.import" locked="False" specularamount="1" specularreflection="#Default_white_002_specularreflection" />
- <Add ref="#Default_white_002_specularreflection" locked="False" mappingmode="Environmental Mapping" sourcepath="../maps/OpenfootageNET_garage-512.hdr" />
- <Add ref="#GaugeNeedle_002" name="GaugeNeedle" controlledproperty="" locked="False" position="0 0.5 0" />
- <Add ref="#GaugeTickmarks_001" name="GaugeTickmarks" controlledproperty="" locked="False" scale="1 1 1" />
- <Add ref="#tickmark_8_small" name="tickmark_8_small" controlledproperty="$darkThemeVisible eyeball" importfile="models/tickmark_8_small/tickmark_8_small.import" locked="False" scale="1.3 1.3 1.3" sourcepath="../models/tickmark_8_small/tickmark_8_small.import" />
- <Add ref="#qt_gauge_tickmarks_8_small" importfile="models/tickmark_8_small/tickmark_8_small.import" locked="False" />
- <Add ref="#Default_white_003" importfile="models/tickmark_8_small/tickmark_8_small.import" locked="False" />
- <Add ref="#GaugeNumbers_001" name="GaugeNumbers" locked="False" rotation="90 0 0" scale="0.17 0.17 0.17" />
- <Add ref="#Rpm7" name="Rpm7" controlledproperty="$darkThemeVisible eyeball" locked="False" position="1.77449 4.30839 0" scale="1.24 1.24 1.24" sourcepath="#Rectangle" />
- <Add ref="#Material_004" controlledproperty="" diffusemap="#Material_004_diffusemap" locked="False" shaderlighting="None" />
- <Add ref="#Material_004_diffusemap" locked="False" sourcepath="../maps/Rpm7.png" />
- <Add ref="#GaugeText_001" name="GaugeText" locked="False" />
- <State id="Scene-Front" name="Front" playmode="Stop at end" playthroughto="Next" >
- <Set ref="#Scene" >
- <Action id="Scene-Action" eyeball="True" triggerObject="#Scene" event="onPressureDown" targetObject="#Scene" handler="Go to Slide" >
- <HandlerArgument name="Slide" type="String" argtype="Slide" value="Angle" />
- </Action>
- </Set>
- <Set ref="#Cluster3D2" endtime="24083" />
- <Set ref="#Camera_002" endtime="24083" />
- <Set ref="#Cluster_001" endtime="24083" />
- <Set ref="#MainGauges" endtime="24083" />
- <Set ref="#LeftGauge_001" endtime="24083" rotation="-90 0 0" />
- <Set ref="#GaugeBackground" endtime="24083" />
- <Set ref="#roundbg_1" endtime="24083" />
- <Set ref="#qt_gauge_background_round_1" endtime="24083" />
- <Set ref="#Ring_2" endtime="24083" eyeball="False" />
- <Set ref="#qt_gauge_ring_2" endtime="24083" />
- <Set ref="#GaugeNeedle" endtime="24083" />
- <Set ref="#GaugeTickmarks" endtime="24083" />
- <Set ref="#tickmark_260" endtime="24083" />
- <Set ref="#qt_gauge_tickmarks_260" endtime="24083" />
- <Set ref="#GaugeNumbers" endtime="24083" />
- <Set ref="#kmh260" endtime="24083" />
- <Set ref="#RightGauge_001" endtime="24083" rotation="-90 0 0" />
- <Set ref="#GaugeBackground_001" endtime="24083" />
- <Set ref="#roundbg_1_001" endtime="24083" />
- <Set ref="#qt_gauge_background_round_1_001" endtime="24083" />
- <Set ref="#Ring_2_001" endtime="24083" eyeball="False" />
- <Set ref="#qt_gauge_ring_2_001" endtime="24083" />
- <Set ref="#GaugeNeedle_002" endtime="24083" />
- <Set ref="#GaugeTickmarks_001" endtime="24083" />
- <Set ref="#tickmark_8_small" endtime="24083" />
- <Set ref="#qt_gauge_tickmarks_8_small" endtime="24083" />
- <Set ref="#GaugeNumbers_001" endtime="24083" />
- <Set ref="#Rpm7" endtime="24083" />
- <Set ref="#GaugeText_001" endtime="24083" />
- <Add ref="#DangerLight" name="DangerLight" brightness="130" controlledproperty="" endtime="24083" lightambient="0.129412 0.65098 0.607843" lightdiffuse="1 1 1" lighttype="Point" linearfade="0" position="0 0 0" scope="#SpeedLimitObject" />
- <Add ref="#Light2" name="MainLight" brightness="45" controlledproperty="$mainLightColor lightdiffuse $mainLightColor lightambient" endtime="24083" lightambient="0 0 0" lightdiffuse="1 1 1" lightspecular="1 1 1" lighttype="Directional" position="0 0 0" rotation="10 0 0" scale="11 11 1" scope="#LeftGauge_001" />
- <Add ref="#MainLight2" name="MainLight2" brightness="50" controlledproperty="$mainLightColor lightdiffuse $mainLightColor lightambient" endtime="24083" lightambient="0 0 0" lightdiffuse="1 1 1" lightspecular="1 1 1" lighttype="Directional" position="0 0 0" rotation="10 0 0" scale="11 11 1" scope="#RightGauge_001" />
- <Add ref="#gauges" name="gauges" endtime="24083" importfile="../models/gauges/gauges.import" position="-0.384471 1.982 0.287" rotation="0 0 -90" scale="1.6 2.3 2.3" sourcepath="../models/gauges/gauges.import" />
- <Add ref="#Automotive_Gauges" endtime="24083" importfile="../models/gauges/gauges.import" />
- <Add ref="#Material_002" name="Material" endtime="24083" referencedmaterial="#white_animatable" />
- <Add ref="#glass1" endtime="24083" importfile="../models/gauges/gauges.import" />
- <Add ref="#Material_001_animatable" name="Material_001_animatable" endtime="24083" referencedmaterial="#Material_001_animatable_001" />
- <Add ref="#SpeedLimitObject" name="SpeedLimitObject" controlledproperty="$speedLimitObjectVisible eyeball" endtime="24083" position="-9 2.56995 10" rotation="0 0 0" scale="0.07 0.005 0.07" sourcepath="#Cylinder" />
- <Add ref="#Cylinder" name="Cylinder" controlledproperty="$speedLimitObjectVisible eyeball" endtime="24083" position="0.927 27 0.12" scale="0.8 1 0.8" sourcepath="#Cylinder" />
- <Add ref="#Default_animatable" name="Default_animatable" blendmode="Normal" bumpamount="0.5" diffuse="1 1 1" diffuselightwrap="0" displaceamount="20" emissivecolor="1 1 1" emissivepower="0" fresnelPower="0" importfile="" importid="" ior="1.5" opacity="100" shaderlighting="None" sourcepath="" specularamount="0" specularmodel="Default" specularroughness="0" speculartint="1 1 1" translucentfalloff="1" type="Material" vertexcolors="False" />
- <Add ref="#SpeedLimit" name="SpeedLimit" controlledproperty="$speedLimitText textstring $speedLimitObjectVisible eyeball" dropshadow="True" dropshadowoffsetx="32" dropshadowstrength="100" elide="False" endtime="24083" font="russianroadsign-medium" horzalign="Center" position="0 60 2" rotation="90 0 0" scale="0.8 0.8 0.8" size="72" textcolor="0 0 0" textstring="120" wordwrap="WrapWord" />
- <Add ref="#Default" name="Default" blendmode="Normal" diffuse="0.435294 0 0" shaderlighting="Pixel" specularroughness="0.001" speculartint="1 1 1" vertexcolors="False" />
- <Add ref="#roundbg_1_002" name="roundbg_white" controlledproperty="$lightThemeVisible eyeball" endtime="24083" importfile="models/roundbg_1/roundbg_1.import" locked="False" position="0 -0.01 0" scale="0.89 0.9 0.89" sourcepath="../models/roundbg_1/roundbg_1.import" />
- <Add ref="#qt_gauge_background_round_1_002" controlledproperty="$lightThemeVisible eyeball" endtime="24083" importfile="models/roundbg_1/roundbg_1.import" locked="False" />
- <Add ref="#background_1_002" bumpamount="1" importfile="models/roundbg_1/roundbg_1.import" ior="0.18" locked="False" specularamount="0.5" specularreflection="#background_1_002_specularreflection" specularroughness="0.321" />
- <Add ref="#background_1_002_diffusemap" importfile="models/roundbg_1/roundbg_1.import" locked="False" sourcepath="../maps/gradient_lines_001-w.png" subpresentation="" />
- <Add ref="#background_1_002_specularreflection" locked="False" mappingmode="Environmental Mapping" sourcepath="../maps/OpenfootageNET_garage-512.hdr" />
- <Add ref="#tickmark_260_001" name="tickmark_260White" controlledproperty="$lightThemeVisible eyeball" endtime="24083" importfile="models/tickmark_260/tickmark_260.import" locked="False" sourcepath="../models/tickmark_260/tickmark_260.import" />
- <Add ref="#qt_gauge_tickmarks_260_001" endtime="24083" importfile="models/tickmark_260/tickmark_260.import" locked="False" />
- <Add ref="#black_tickmarks" name="black_tickmarks" diffuse="0 0 0" shaderlighting="None" />
- <Add ref="#kmh260_001" name="kmh260white" controlledproperty="$lightThemeVisible eyeball" endtime="24083" locked="False" position="1.52588e-05 -3.8147e-06 11.4355" rotation="0 0 0" scale="1.024 1.024 1" sourcepath="#Rectangle" />
- <Add ref="#Material" bumpamount="0.5" controlledproperty="" diffusemap="#Material_diffusemap" emissivepower="0" locked="False" shaderlighting="None" />
- <Add ref="#Material_diffusemap" locked="False" sourcepath="../maps/kmh260-w.png" subpresentation="" />
- <Add ref="#gauges_001" name="gauges" endtime="24083" importfile="../models/gauges/gauges.import" position="-0.48343 1.982 0.287" rotation="0 0 -90" scale="1.6 2.3 2.3" sourcepath="../models/gauges/gauges.import" />
- <Add ref="#Automotive_Gauges_001" endtime="24083" importfile="../models/gauges/gauges.import" />
- <Add ref="#white_animatable" name="chromeMat" diffuse="0 0 0" specularreflection="#white_animatable_specularreflection" speculartint="1 1 1" />
- <Add ref="#white_animatable_specularreflection" mappingmode="Environmental Mapping" sourcepath="../maps/chromeMap.jpg" subpresentation="" />
- <Add ref="#glass1_001" endtime="24083" importfile="../models/gauges/gauges.import" />
- <Add ref="#Material_001_animatable_001" name="glassMat" blendmode="Normal" bumpamount="0.5" diffuse="1 1 1" diffuselightwrap="0" diffusemap="#Material_001_animatable_001_diffusemap" displaceamount="20" emissivecolor="1 1 1" emissivepower="0" fresnelPower="0" importfile="../models/gauges/gauges.import" importid="Material_001" ior="1.5" opacity="15" shaderlighting="Pixel" sourcepath="" specularamount="5" specularmap="#Material_001_animatable_001_specularmap" specularmodel="Default" specularroughness="1" speculartint="1 1 1" translucentfalloff="1" type="Material" vertexcolors="False" />
- <Add ref="#Material_001_animatable_001_specularmap" sourcepath="../maps/Glass-alpha05.png" subpresentation="" />
- <Add ref="#Material_001_animatable_001_diffusemap" sourcepath="../maps/Glass-alpha05.png" subpresentation="" />
- <Add ref="#roundbg_1_003" name="roundbg_1_wh" controlledproperty="$lightThemeVisible eyeball" endtime="24083" importfile="models/roundbg_1/roundbg_1.import" locked="False" position="0 -0.01 0" scale="0.89 0.9 0.89" sourcepath="../models/roundbg_1/roundbg_1.import" />
- <Add ref="#qt_gauge_background_round_1_003" controlledproperty="$lightThemeVisible eyeball" endtime="24083" importfile="models/roundbg_1/roundbg_1.import" locked="False" />
- <Add ref="#background_1_003" bumpamount="1" importfile="models/roundbg_1/roundbg_1.import" ior="0.19" locked="False" specularamount="0.5" specularreflection="#background_1_003_specularreflection" specularroughness="0.31069" />
- <Add ref="#background_1_003_diffusemap" importfile="models/roundbg_1/roundbg_1.import" locked="False" sourcepath="../maps/gradient_lines_001-w.png" subpresentation="" />
- <Add ref="#background_1_003_specularreflection" locked="False" mappingmode="Environmental Mapping" sourcepath="../maps/OpenfootageNET_garage-512.hdr" />
- <Add ref="#tickmark_8_small_001" name="tickmark_8_smallWh" controlledproperty="$lightThemeVisible eyeball" endtime="24083" importfile="models/tickmark_8_small/tickmark_8_small.import" locked="False" scale="1.28 1.28 1.3" sourcepath="../models/tickmark_8_small/tickmark_8_small.import" />
- <Add ref="#qt_gauge_tickmarks_8_small_001" endtime="24083" importfile="models/tickmark_8_small/tickmark_8_small.import" locked="False" />
- <Add ref="#Default_black" name="Default_black" blendmode="Normal" bumpamount="0.5" diffuse="0 0 0" diffuselightwrap="0" displaceamount="20" emissivecolor="1 1 1" emissivepower="0" fresnelPower="0" importfile="" importid="" ior="1.5" opacity="100" shaderlighting="None" sourcepath="" specularamount="0" specularmodel="Default" specularroughness="0" speculartint="1 1 1" translucentfalloff="1" type="Material" vertexcolors="False" />
- <Add ref="#Rpm7_001" name="Rpm7_wh" controlledproperty="$lightThemeVisible eyeball" endtime="24083" locked="False" position="1.77449 4.30839 0" scale="1.24 1.24 1.24" sourcepath="#Rectangle" />
- <Add ref="#Material_001" controlledproperty="" diffusemap="#Material_001_diffusemap" locked="False" shaderlighting="None" />
- <Add ref="#Material_001_diffusemap" locked="False" sourcepath="../maps/Rpm7-w.png" subpresentation="" />
- </State>
- </State>
- <State name="Master Slide" component="#GaugeNeedle" >
- <Add ref="#GaugeNeedle_001" name="GaugeNeedle" controlledproperty="" endtime="3000" position="0 3 1.31134e-07" rotation="0 -136 0" scale="0.9 0.9 0.9" />
- <Add ref="#needle_2" name="needle_2" controlledproperty="$speedVectorQml rotation" endtime="3000" importfile="models/needle_2/needle_2.import" rotation="0 36 0" sourcepath="../models/needle_2/needle_2.import" />
- <Add ref="#qt_gauge_needles_2" endtime="3000" importfile="models/needle_2/needle_2.import" rotation="0 0 0" />
- <Add ref="#qt_gauge_needles:red_transparent" blendmode="Normal" diffuse="0.666667 0 0" emissivecolor="1 1 1" importfile="models/needle_2/needle_2.import" shaderlighting="None" specularroughness="1" />
- <Add ref="#qt_gauge_needles:black_solid" diffuse="0.34902 0.34902 0.34902" importfile="models/needle_2/needle_2.import" shaderlighting="Pixel" />
- <Add ref="#qt_gauge_needles:solidWhite" diffuse="0 0 0" importfile="models/needle_2/needle_2.import" specularamount="2.5" specularreflection="#qt_gauge_needles:solidWhite_specularreflection" />
- <Add ref="#qt_gauge_needles:solidWhite_specularreflection" mappingmode="Environmental Mapping" sourcepath="../maps/OpenfootageNET_garage-512.hdr" subpresentation="" />
- <State id="GaugeNeedle-Slide1" name="Slide1" initialplaystate="Play" playmode="PingPong" >
- <Add ref="#gaugesLight" name="gaugesLight" brightness="150" castshadow="False" lightdiffuse="1 1 1" lightspecular="1 1 1" lighttype="Point" linearfade="1000" position="0 0 11.5" rotation="0 0 0" scale="0.05 0.05 2" scope="#LeftGauge_001" shdwfactor="1" />
- </State>
- </State>
- <State name="Master Slide" component="#GaugeNeedle_002" playmode="PingPong" >
- <Add ref="#GaugeNeedle_003" name="GaugeNeedle" controlledproperty="" endtime="3000" rotation="4.07111e-13 -136 4.07111e-13" scale="0.9 0.9 0.9" />
- <Add ref="#needle_2_001" name="needle_2" controlledproperty="$rpmVectorQml rotation" endtime="3000" importfile="models/needle_2/needle_2.import" rotation="0 217 0" sourcepath="../models/needle_2/needle_2.import" />
- <Add ref="#qt_gauge_needles_2_001" controlledproperty="" endtime="3000" importfile="models/needle_2/needle_2.import" />
- <Add ref="#qt_gauge_needles:red_transparent_001" diffuse="0.666667 0 0" importfile="models/needle_2/needle_2.import" shaderlighting="None" />
- <Add ref="#qt_gauge_needles:black_solid_001" diffuse="0.34902 0.34902 0.34902" importfile="models/needle_2/needle_2.import" shaderlighting="Pixel" />
- <Add ref="#qt_gauge_needles:solidWhite_001" diffuse="0 0 0" importfile="models/needle_2/needle_2.import" specularamount="2.5" specularreflection="#qt_gauge_needles:solidWhite_001_specularreflection" vertexcolors="False" />
- <Add ref="#qt_gauge_needles:solidWhite_001_specularreflection" mappingmode="Environmental Mapping" sourcepath="../maps/OpenfootageNET_garage-512.hdr" subpresentation="" />
- <State id="GaugeNeedle-Slide1_001" name="Slide1" initialplaystate="Play" playmode="PingPong" >
- <Set ref="#GaugeNeedle_003" endtime="7000" />
- <Set ref="#needle_2_001" endtime="7000" />
- <Set ref="#qt_gauge_needles_2_001" endtime="7000" />
- <Add ref="#LightGagugesRight" name="LightGagugesRight" brightness="160" endtime="7000" lighttype="Point" linearfade="1000" position="0 0 11.5" scope="#RightGauge_001" />
- </State>
- </State>
- </Logic>
- <Guides >
- <Guide direction="Vertical" position="40" width="1" />
- <Guide direction="Vertical" position="1240" width="1" />
- <Guide direction="Horizontal" position="10" width="1" />
- <Guide direction="Vertical" position="200" width="1" />
- </Guides>
- </Project>
+<UIP version="6" >
+ <Project >
+ <ProjectSettings author="" company="" presentationWidth="1280" presentationHeight="480" maintainAspect="False" preferKtx="False" flipCompressedTextures="False" >
+ <CustomColors count="16" >#ff902f #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff</CustomColors>
+ </ProjectSettings>
+ <BufferData >
+ <ImageBuffer sourcepath="../maps/Glass-alpha05.png" hasTransparency="True" hasOpaquePixels="True" />
+ <ImageBuffer sourcepath="../maps/OpenfootageNET_garage-512.hdr" hasTransparency="False" />
+ <ImageBuffer sourcepath="../maps/Rpm7-w.png" hasTransparency="True" hasOpaquePixels="True" />
+ <ImageBuffer sourcepath="../maps/Rpm7.png" hasTransparency="True" hasOpaquePixels="True" />
+ <ImageBuffer sourcepath="../maps/chromeMap.jpg" hasTransparency="False" hasOpaquePixels="True" />
+ <ImageBuffer sourcepath="../maps/gradient_lines_001-w.png" hasTransparency="True" hasOpaquePixels="True" />
+ <ImageBuffer sourcepath="../maps/gradient_lines_001.png" hasTransparency="False" hasOpaquePixels="True" />
+ <ImageBuffer sourcepath="../maps/kmh260-w.png" hasTransparency="True" hasOpaquePixels="True" />
+ <ImageBuffer sourcepath="../maps/kmh260.png" hasTransparency="True" hasOpaquePixels="True" />
+ <ImageBuffer sourcepath="../models/roundbg_1/maps/gradient.png" hasTransparency="True" hasOpaquePixels="True" />
+ </BufferData>
+ <Graph >
+ <Scene id="Scene_u30224" backgroundcolor="0.27451 0.27451 0.27451 1" bgcolorenable="False" controlledproperty="" >
+ <Layer id="Cluster3D2_u35394" variants="" >
+ <Camera id="Camera_u42921" >
+ <Light id="DangerLight_u27765" />
+ <Light id="Light2_u52691" />
+ <Light id="MainLight2_u46095" />
+ </Camera>
+ <Group id="Cluster_u14872" variants="" >
+ <Group id="MainGauges_u28973" variants="" >
+ <Group id="LeftGauge_u25727" variants="" >
+ <Group id="gauges_u4376" variants="" importid="__import__root__" orientation="Right Handed" position="0 0 0" rotation="-90 0 0" rotationorder="XYZr" scale="1 1 1" >
+ <Model id="Automotive_u25296" variants="" name="Automotive_Gauges" importid="Automotive_Gauges" orientation="Right Handed" position="2.13057 0.118131 -0.124425" rotation="0 0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/gauges/meshes/Automotive_Gauges.mesh" >
+ <ReferencedMaterial id="Material_u56406" />
+ </Model>
+ <Model id="glass1_u21979" variants="" name="glass1" importid="glass1" orientation="Right Handed" position="0.632279 0.11815 -0.124416" rotation="0 0 0" rotationorder="XYZr" scale="1.02503 1.02503 1.02503" sourcepath="../models/gauges/meshes/glass1.mesh" >
+ <ReferencedMaterial id="Material_001_u31247" />
+ </Model>
+ </Group>
+ <Model id="SpeedLimitObject_u15906" variants="" >
+ <Model id="Cylinder_u40928" variants="" >
+ <Material id="Default_u6112" />
+ <Text id="SpeedLimit_u45955" variants="" />
+ </Model>
+ <Material id="Default_u30340" />
+ </Model>
+ <Group id="GaugeBackground_u5218" variants="" >
+ <Group id="roundbg_u26875" variants="" importid="__import__root__" >
+ <Model id="qt_gauge_background_round_u39463" variants="" name="qt_gauge_background_round_1" importid="qt_gauge_background_round_1" orientation="Right Handed" position="0 0 0" rotation="0 0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/roundbg_1/meshes/qt_gauge_background_round_1.mesh" >
+ <Material id="background_u40604" name="background_1" blendmode="Normal" diffuse="1 1 1 1" diffusemap="#background_1_u18748" emissivepower="0" importid="background_1" opacity="100" specularamount="0" >
+ <Image id="background_1_u18748" name="background_1_diffusemap" importid="background_1_diffusemap" sourcepath="../models/roundbg_1/maps/gradient.png" />
+ <Image id="background_1_u40795" />
+ </Material>
+ </Model>
+ </Group>
+ <Group id="roundbg_1_u44870" variants="" importid="__import__root__" >
+ <Model id="qt_gauge_background_round_1_u36878" variants="" name="qt_gauge_background_round_1" importid="qt_gauge_background_round_1" orientation="Right Handed" position="0 0 0" rotation="0 0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/roundbg_1/meshes/qt_gauge_background_round_1.mesh" >
+ <Material id="background_1_u45992" name="background_1" blendmode="Normal" diffuse="1 1 1 1" diffusemap="#background_1_002_u15278" emissivepower="0" importid="background_1" opacity="100" specularamount="0" >
+ <Image id="background_1_002_u15278" name="background_1_diffusemap" importid="background_1_diffusemap" sourcepath="../models/roundbg_1/maps/gradient.png" />
+ </Material>
+ </Model>
+ </Group>
+ </Group>
+ <Component id="GaugeNeedle_u7157" variants="" >
+ <Group id="GaugeNeedle_u56675" variants="" >
+ <Group id="needle_u24306" variants="" importid="__import__root__" >
+ <Model id="qt_gauge_needles_u26269" variants="" name="qt_gauge_needles_2" importid="qt_gauge_needles_2" orientation="Right Handed" position="0 0 0" rotation="0 0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/needle_2/meshes/qt_gauge_needles_2.mesh" >
+ <Material id="qt_gauge_needles:red_u52137" name="qt_gauge_needles:red_transparent" blendmode="Normal" diffuse="1 1 1 1" emissivepower="0" importid="qt_gauge_needles:red_transparent" opacity="100" specularamount="0" />
+ <Material id="qt_gauge_needles:black_u14627" name="qt_gauge_needles:black_solid" blendmode="Normal" diffuse="1 1 1 1" emissivepower="0" importid="qt_gauge_needles:black_solid" opacity="100" specularamount="0" />
+ <Material id="qt_gauge_u63520" name="qt_gauge_needles:solidWhite" blendmode="Normal" diffuse="1 1 1 1" emissivepower="0" importid="qt_gauge_needles:solidWhite" opacity="100" specularamount="0" >
+ <Image id="qt_gauge_needles:solidWhite_u45933" />
+ </Material>
+ </Model>
+ </Group>
+ </Group>
+ </Component>
+ <Group id="GaugeTickmarks_u8995" variants="" >
+ <Group id="tickmark_u15950" variants="" importid="__import__root__" >
+ <Model id="qt_gauge_tickmarks_u31252" variants="" name="qt_gauge_tickmarks_260" importid="qt_gauge_tickmarks_260" orientation="Right Handed" position="0 0 0" rotation="0 0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/tickmark_260/meshes/qt_gauge_tickmarks_260.mesh" >
+ <Material id="Default_white_u59048" name="Default_white" blendmode="Normal" diffuse="1 1 1 1" emissivepower="0" importid="Default_white" opacity="100" specularamount="0" />
+ </Model>
+ </Group>
+ <Group id="tickmark_260_u42690" variants="" importid="__import__root__" >
+ <Model id="qt_gauge_tickmarks_260_u62208" variants="" name="qt_gauge_tickmarks_260" importid="qt_gauge_tickmarks_260" orientation="Right Handed" position="0 0 0" rotation="0 0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/tickmark_260/meshes/qt_gauge_tickmarks_260.mesh" >
+ <Material id="black_u24126" />
+ </Model>
+ </Group>
+ </Group>
+ <Group id="GaugeNumbers_u11292" variants="" >
+ <Model id="kmh260_u16004" variants="" >
+ <Material id="Material_u6961" >
+ <Image id="Material_u46806" />
+ </Material>
+ </Model>
+ <Model id="kmh260_u51037" variants="" >
+ <Material id="Material_u36342" >
+ <Image id="Material_003_u16888" />
+ </Material>
+ </Model>
+ </Group>
+ </Group>
+ <Group id="RightGauge_u34835" variants="" >
+ <Group id="gauges_u64198" variants="" importid="__import__root__" orientation="Right Handed" position="0 0 0" rotation="-90 0 0" rotationorder="XYZr" scale="1 1 1" >
+ <Model id="Automotive_Gauges_u40684" variants="" name="Automotive_Gauges" importid="Automotive_Gauges" orientation="Right Handed" position="2.13057 0.118131 -0.124425" rotation="0 0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/gauges/meshes/Automotive_Gauges.mesh" >
+ <Material id="white_u17128" >
+ <Image id="white_animatable_u30006" />
+ </Material>
+ </Model>
+ <Model id="glass1_u2633" variants="" name="glass1" importid="glass1" orientation="Right Handed" position="0.632279 0.11815 -0.124416" rotation="0 0 0" rotationorder="XYZr" scale="1.02503 1.02503 1.02503" sourcepath="../models/gauges/meshes/glass1.mesh" >
+ <Material id="Material_001_animatable_u26559" >
+ <Image id="Material_001_animatable_001_u5115" />
+ <Image id="Material_001_animatable_001_u39339" />
+ </Material>
+ </Model>
+ </Group>
+ <Group id="GaugeBackground_u39636" variants="" >
+ <Group id="roundbg_1_u51871" variants="" importid="__import__root__" >
+ <Model id="qt_gauge_background_round_1_u24124" variants="" name="qt_gauge_background_round_1" importid="qt_gauge_background_round_1" orientation="Right Handed" position="0 0 0" rotation="0 0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/roundbg_1/meshes/qt_gauge_background_round_1.mesh" >
+ <Material id="background_1_u13997" name="background_1" blendmode="Normal" diffuse="1 1 1 1" diffusemap="#background_1_001_u14219" emissivepower="0" importid="background_1" opacity="100" specularamount="0" >
+ <Image id="background_1_001_u14219" name="background_1_diffusemap" importid="background_1_diffusemap" sourcepath="../models/roundbg_1/maps/gradient.png" />
+ <Image id="background_1_001_u19087" />
+ </Material>
+ </Model>
+ </Group>
+ <Group id="roundbg_1_u11102" variants="" importid="__import__root__" >
+ <Model id="qt_gauge_background_round_1_u2033" variants="" name="qt_gauge_background_round_1" importid="qt_gauge_background_round_1" orientation="Right Handed" position="0 0 0" rotation="0 0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/roundbg_1/meshes/qt_gauge_background_round_1.mesh" >
+ <ReferencedMaterial id="background_1_u25822" />
+ </Model>
+ </Group>
+ </Group>
+ <Component id="GaugeNeedle_u33184" variants="" >
+ <Group id="GaugeNeedle_u58092" variants="" >
+ <Group id="needle_2_u61240" variants="" importid="__import__root__" >
+ <Model id="qt_gauge_needles_2_u17133" variants="" name="qt_gauge_needles_2" importid="qt_gauge_needles_2" orientation="Right Handed" position="0 0 0" rotation="0 0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/needle_2/meshes/qt_gauge_needles_2.mesh" >
+ <Material id="qt_gauge_needles:red_transparent_u41926" name="qt_gauge_needles:red_transparent" blendmode="Normal" diffuse="1 1 1 1" emissivepower="0" importid="qt_gauge_needles:red_transparent" opacity="100" specularamount="0" />
+ <Material id="qt_gauge_needles:black_solid_u25928" name="qt_gauge_needles:black_solid" blendmode="Normal" diffuse="1 1 1 1" emissivepower="0" importid="qt_gauge_needles:black_solid" opacity="100" specularamount="0" />
+ <Material id="qt_gauge_needles:solidWhite_u26596" name="qt_gauge_needles:solidWhite" blendmode="Normal" diffuse="1 1 1 1" emissivepower="0" importid="qt_gauge_needles:solidWhite" opacity="100" specularamount="0" >
+ <Image id="qt_gauge_needles:solidWhite_001_u31188" />
+ </Material>
+ </Model>
+ </Group>
+ </Group>
+ </Component>
+ <Group id="GaugeTickmarks_u30570" variants="" >
+ <Group id="tickmark_8_u36930" variants="" importid="__import__root__" >
+ <Model id="qt_gauge_tickmarks_8_u59833" variants="" name="qt_gauge_tickmarks_8_small" importid="qt_gauge_tickmarks_8_small" orientation="Right Handed" position="0 0 0" rotation="0 0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/tickmark_8_small/meshes/qt_gauge_tickmarks_8_small.mesh" >
+ <Material id="Default_white_u11047" name="Default_white" blendmode="Normal" diffuse="1 1 1 1" emissivepower="0" importid="Default_white" opacity="100" specularamount="0" />
+ </Model>
+ </Group>
+ <Group id="tickmark_8_small_u23239" variants="" importid="__import__root__" >
+ <Model id="qt_gauge_tickmarks_8_small_u61469" variants="" name="qt_gauge_tickmarks_8_small" importid="qt_gauge_tickmarks_8_small" orientation="Right Handed" position="0 0 0" rotation="0 0 0" rotationorder="XYZr" scale="1 1 1" sourcepath="../models/tickmark_8_small/meshes/qt_gauge_tickmarks_8_small.mesh" >
+ <Material id="Default_u1934" />
+ </Model>
+ </Group>
+ </Group>
+ <Group id="GaugeNumbers_u46041" variants="" >
+ <Model id="Rpm7_u41311" variants="" >
+ <Material id="Material_u46848" >
+ <Image id="Material_001_u473" />
+ </Material>
+ </Model>
+ <Model id="Rpm7_u49064" variants="" >
+ <Material id="Material_u16565" >
+ <Image id="Material_004_u54398" />
+ </Material>
+ </Model>
+ </Group>
+ </Group>
+ </Group>
+ </Group>
+ </Layer>
+ </Scene>
+ </Graph>
+ <Logic >
+ <State name="Master Slide" component="#Scene_u30224" >
+ <Add ref="#Cluster3D2_u35394" name="Cluster3D" aodither="False" aosamplerate="3" aostrength="0" background="Transparent" backgroundcolor="1 1 1 1" height="100" heightunits="percent" leftunits="percent" multisampleaa="SSAA" probe2fade="1" probebright="231" probefov="169.26" probehorizon="-1" progressiveaa="8x" temporalaa="False" width="100" widthunits="percent" />
+ <Add ref="#Camera_u42921" fov="8.16" orthographic="False" position="0 0 -395" rotation="0 0 0" />
+ <Add ref="#Cluster_u14872" name="Cluster" controlledproperty="$mainPanelOpacity opacity" position="2.29138 -2.5 0" />
+ <Add ref="#MainGauges_u28973" name="MainGauges" locked="False" position="0 0.268 -1.522" rotation="0 0 0" />
+ <Add ref="#LeftGauge_u25727" name="LeftGauge" controlledproperty="$gaugesScale scale $speedGaugeRotation rotation $speedGaugePosition position" locked="False" pivot="0 0 0" position="-52 0 0" rotation="-60 -30 0" scale="1.7 1.7 1.7" />
+ <Add ref="#GaugeBackground_u5218" name="GaugeBackground" controlledproperty="" locked="False" position="0 0 0" scale="1 5 1" />
+ <Add ref="#roundbg_u26875" name="roundbg_1" controlledproperty="$darkThemeVisible eyeball" importfile="models/roundbg_1/roundbg_1.import" locked="False" position="0 0 0" scale="0.89 0.9 0.89" sourcepath="../models/roundbg_1/roundbg_1.import" />
+ <Add ref="#qt_gauge_background_round_u39463" controlledproperty="$darkThemeVisible eyeball" importfile="models/roundbg_1/roundbg_1.import" locked="False" />
+ <Add ref="#background_u40604" bumpamount="1" controlledproperty="$mainLightColor diffuse" importfile="models/roundbg_1/roundbg_1.import" ior="0.18" locked="False" specularamount="0.2" specularreflection="#background_1_u40795" specularroughness="0.321" />
+ <Add ref="#background_1_u18748" importfile="models/roundbg_1/roundbg_1.import" locked="False" sourcepath="../maps/gradient_lines_001.png" />
+ <Add ref="#background_1_u40795" locked="False" mappingmode="Environmental Mapping" sourcepath="../maps/OpenfootageNET_garage-512.hdr" />
+ <Add ref="#GaugeNeedle_u7157" name="GaugeNeedle" controlledproperty="$speedVectorQml rotation" locked="False" position="0 -3.2 0" />
+ <Add ref="#GaugeTickmarks_u8995" name="GaugeTickmarks" controlledproperty="" locked="False" />
+ <Add ref="#tickmark_u15950" name="tickmark_260" controlledproperty="$darkThemeVisible eyeball" importfile="models/tickmark_260/tickmark_260.import" locked="False" sourcepath="../models/tickmark_260/tickmark_260.import" />
+ <Add ref="#qt_gauge_tickmarks_u31252" importfile="models/tickmark_260/tickmark_260.import" locked="False" />
+ <Add ref="#Default_white_u59048" diffuse="1 1 1 1" importfile="models/tickmark_260/tickmark_260.import" locked="False" />
+ <Add ref="#GaugeNumbers_u11292" name="GaugeNumbers" controlledproperty="" locked="False" position="0.597784 2 0.170977" rotation="90 0 0" scale="0.17 0.17 0.17" />
+ <Add ref="#kmh260_u51037" name="kmh260" controlledproperty="$darkThemeVisible eyeball" locked="False" position="1.52588e-05 -3.8147e-06 11.4355" rotation="0 0 0" scale="1.024 1.024 1" sourcepath="#Rectangle" />
+ <Add ref="#Material_u36342" bumpamount="0.5" controlledproperty="" diffusemap="#Material_003_u16888" emissivepower="0" locked="False" shaderlighting="None" />
+ <Add ref="#Material_003_u16888" locked="False" sourcepath="../maps/kmh260.png" />
+ <Add ref="#RightGauge_u34835" name="RightGauge" controlledproperty="$gaugesScale scale $rpmGaugeRotation rotation $rpmGaugePosition position" locked="False" position="48 0 0" rotation="-60 30 0" scale="1.7 1.7 1.7" />
+ <Add ref="#GaugeBackground_u39636" name="GaugeBackground" locked="False" position="0 0 0" scale="1 5 1" />
+ <Add ref="#roundbg_1_u51871" name="roundbg_1" controlledproperty="$darkThemeVisible eyeball" importfile="models/roundbg_1/roundbg_1.import" locked="False" position="0 0 0" scale="0.89 0.9 0.89" sourcepath="../models/roundbg_1/roundbg_1.import" />
+ <Add ref="#qt_gauge_background_round_1_u24124" controlledproperty="$darkThemeVisible eyeball" importfile="models/roundbg_1/roundbg_1.import" locked="False" />
+ <Add ref="#background_1_u13997" bumpamount="1" controlledproperty="$mainLightColor diffuse" importfile="models/roundbg_1/roundbg_1.import" ior="0.19" locked="False" specularamount="0.2" specularreflection="#background_1_001_u19087" specularroughness="0.31069" />
+ <Add ref="#background_1_001_u14219" importfile="models/roundbg_1/roundbg_1.import" locked="False" sourcepath="../maps/gradient_lines_001.png" />
+ <Add ref="#background_1_001_u19087" locked="False" mappingmode="Environmental Mapping" sourcepath="../maps/OpenfootageNET_garage-512.hdr" />
+ <Add ref="#GaugeNeedle_u33184" name="GaugeNeedle" controlledproperty="" locked="False" position="0 -0.2 0" />
+ <Add ref="#GaugeTickmarks_u30570" name="GaugeTickmarks" controlledproperty="" locked="False" scale="1 1 1" />
+ <Add ref="#tickmark_8_u36930" name="tickmark_8_small" controlledproperty="$darkThemeVisible eyeball" importfile="models/tickmark_8_small/tickmark_8_small.import" locked="False" scale="1.28 1.28 1.3" sourcepath="../models/tickmark_8_small/tickmark_8_small.import" />
+ <Add ref="#qt_gauge_tickmarks_8_u59833" importfile="models/tickmark_8_small/tickmark_8_small.import" locked="False" />
+ <Add ref="#Default_white_u11047" importfile="models/tickmark_8_small/tickmark_8_small.import" locked="False" />
+ <Add ref="#GaugeNumbers_u46041" name="GaugeNumbers" locked="False" rotation="90 0 0" scale="0.17 0.17 0.17" />
+ <Add ref="#Rpm7_u49064" name="Rpm7" controlledproperty="$darkThemeVisible eyeball" locked="False" position="1.77449 4.30839 0" scale="1.24 1.24 1.24" sourcepath="#Rectangle" />
+ <Add ref="#Material_u16565" controlledproperty="" diffusemap="#Material_004_u54398" locked="False" shaderlighting="None" />
+ <Add ref="#Material_004_u54398" locked="False" sourcepath="../maps/Rpm7.png" />
+ <State id="Scene-Front_u22709" name="Front" playmode="Stop at end" playthroughto="Next" >
+ <Set ref="#Scene_u30224" >
+ <Action id="Scene-Action_u39472" eyeball="True" triggerObject="#Scene_u30224" event="onPressureDown" targetObject="#Scene_u30224" handler="Go to Slide" >
+ <HandlerArgument name="Slide" type="String" argtype="Slide" value="Angle" />
+ </Action>
+ </Set>
+ <Set ref="#Cluster3D2_u35394" endtime="24083" />
+ <Set ref="#Camera_u42921" endtime="24083" />
+ <Set ref="#Cluster_u14872" endtime="24083" />
+ <Set ref="#MainGauges_u28973" endtime="24083" />
+ <Set ref="#LeftGauge_u25727" endtime="24083" rotation="-90 0 0" />
+ <Set ref="#GaugeBackground_u5218" endtime="24083" />
+ <Set ref="#roundbg_u26875" endtime="24083" eyeball="False" />
+ <Set ref="#qt_gauge_background_round_u39463" endtime="24083" />
+ <Set ref="#GaugeNeedle_u7157" endtime="24083" />
+ <Set ref="#GaugeTickmarks_u8995" endtime="24083" />
+ <Set ref="#tickmark_u15950" endtime="24083" />
+ <Set ref="#qt_gauge_tickmarks_u31252" endtime="24083" />
+ <Set ref="#GaugeNumbers_u11292" endtime="24083" />
+ <Set ref="#kmh260_u51037" endtime="24083" />
+ <Set ref="#RightGauge_u34835" endtime="24083" rotation="-90 0 0" />
+ <Set ref="#GaugeBackground_u39636" endtime="24083" />
+ <Set ref="#roundbg_1_u51871" endtime="24083" eyeball="False" />
+ <Set ref="#qt_gauge_background_round_1_u24124" endtime="24083" />
+ <Set ref="#GaugeNeedle_u33184" endtime="24083" />
+ <Set ref="#GaugeTickmarks_u30570" endtime="24083" />
+ <Set ref="#tickmark_8_u36930" endtime="24083" />
+ <Set ref="#qt_gauge_tickmarks_8_u59833" endtime="24083" />
+ <Set ref="#GaugeNumbers_u46041" endtime="24083" />
+ <Set ref="#Rpm7_u49064" endtime="24083" />
+ <Add ref="#DangerLight_u27765" name="DangerLight" brightness="130" controlledproperty="" endtime="24083" lightambient="1 1 1 1" lightdiffuse="1 1 1 1" lighttype="Point" linearfade="0" position="0 0 0" scope="#SpeedLimitObject_u15906" />
+ <Add ref="#Light2_u52691" name="MainLight" brightness="35" castshadow="False" controlledproperty="$mainLightColor lightdiffuse $mainLightColor lightambient" endtime="24083" lightambient="1 1 1 1" lightdiffuse="1 1 1 1" lightspecular="1 1 1 1" lighttype="Directional" position="0 0 0" rotation="0 -20 0" scale="11 11 10" scope="#LeftGauge_u25727" shdwfactor="10" />
+ <Add ref="#MainLight2_u46095" name="MainLight2" brightness="35" castshadow="False" controlledproperty="$mainLightColor lightdiffuse $mainLightColor lightambient" endtime="24083" lightambient="1 1 1 1" lightdiffuse="1 1 1 1" lightspecular="1 1 1 1" lighttype="Directional" position="0 0 0" rotation="0 20 0" scale="11 11 10" scope="#RightGauge_u34835" shdwfactor="10" />
+ <Add ref="#gauges_u4376" name="gauges" endtime="24083" importfile="../models/gauges/gauges.import" position="-0.384471 1.982 0.287" rotation="0 0 -90" scale="1.6 2.3 2.3" sourcepath="../models/gauges/gauges.import" />
+ <Add ref="#Automotive_u25296" endtime="24083" importfile="../models/gauges/gauges.import" />
+ <Add ref="#Material_u56406" name="Material" endtime="24083" referencedmaterial="#white_u17128" />
+ <Add ref="#glass1_u21979" endtime="24083" importfile="../models/gauges/gauges.import" />
+ <Add ref="#Material_001_u31247" name="Material_001_animatable" endtime="24083" referencedmaterial="#Material_001_animatable_u26559" />
+ <Add ref="#SpeedLimitObject_u15906" name="SpeedLimitObject" controlledproperty="$speedLimitObjectVisible eyeball" endtime="24083" position="-9 2.56995 10" rotation="0 0 0" scale="0.07 0.005 0.07" sourcepath="#Cylinder" />
+ <Add ref="#Cylinder_u40928" name="Cylinder" controlledproperty="$speedLimitObjectVisible eyeball" endtime="24083" position="0.927 27 0.12" scale="0.8 1 0.8" sourcepath="#Cylinder" />
+ <Add ref="#Default_u6112" name="Default_animatable" blendmode="Normal" bumpamount="0.5" diffuse="1 1 1 1" diffuselightwrap="0" displaceamount="20" emissivecolor="1 1 1 1" emissivepower="0" fresnelPower="0" importfile="" importid="" ior="1.5" opacity="100" shaderlighting="None" sourcepath="" specularamount="0" specularmodel="Default" specularroughness="0" speculartint="1 1 1 1" translucentfalloff="1" type="Material" vertexcolors="False" />
+ <Add ref="#SpeedLimit_u45955" name="SpeedLimit" controlledproperty="$speedLimitText textstring $speedLimitObjectVisible eyeball" dropshadow="True" dropshadowoffsetx="32" dropshadowstrength="100" elide="False" endtime="24083" font="russianroadsign-medium" horzalign="Center" position="0 60 2" rotation="90 0 0" scale="0.8 0.8 0.8" size="72" textcolor="0 0 0 1" textstring="120" wordwrap="WrapWord" />
+ <Add ref="#Default_u30340" name="Default" blendmode="Normal" diffuse="0.435294 0 0 1" shaderlighting="Pixel" specularroughness="0.001" speculartint="1 1 1 1" vertexcolors="False" />
+ <Add ref="#roundbg_1_u44870" name="roundbg_white" controlledproperty="$lightThemeVisible eyeball" endtime="24083" importfile="models/roundbg_1/roundbg_1.import" locked="False" position="0 -0.002 0" scale="0.89 0.9 0.89" sourcepath="../models/roundbg_1/roundbg_1.import" />
+ <Add ref="#qt_gauge_background_round_1_u36878" controlledproperty="$lightThemeVisible eyeball" endtime="24083" importfile="models/roundbg_1/roundbg_1.import" locked="False" />
+ <Add ref="#background_1_u45992" blendmode="Normal" bumpamount="1" controlledproperty="$mainLightColor diffuse" cullmode="None" diffuse="1 0.490196 0.498039 1" emissivepower="0" fresnelPower="0" importfile="models/roundbg_1/roundbg_1.import" ior="0" locked="False" shaderlighting="Pixel" specularamount="1" specularroughness="0.001" speculartint="0 0 0 1" transparencymode="Default" vertexcolors="False" />
+ <Add ref="#background_1_002_u15278" importfile="models/roundbg_1/roundbg_1.import" locked="False" scaleu="1" sourcepath="../maps/gradient_lines_001-w.png" subpresentation="" tilingmodehorz="Tiled" />
+ <Add ref="#tickmark_260_u42690" name="tickmark_260White" controlledproperty="$lightThemeVisible eyeball" endtime="24083" importfile="models/tickmark_260/tickmark_260.import" locked="False" position="0 -0.001 0" sourcepath="../models/tickmark_260/tickmark_260.import" />
+ <Add ref="#qt_gauge_tickmarks_260_u62208" endtime="24083" importfile="models/tickmark_260/tickmark_260.import" locked="False" />
+ <Add ref="#black_u24126" name="black_tickmarks" diffuse="0 0 0 1" shaderlighting="None" />
+ <Add ref="#kmh260_u16004" name="kmh260white" controlledproperty="$lightThemeVisible eyeball" endtime="24083" locked="False" position="0 0 11.435" rotation="0 0 0" scale="1.024 1.024 1" sourcepath="#Rectangle" />
+ <Add ref="#Material_u6961" bumpamount="0.5" controlledproperty="" diffusemap="#Material_u46806" emissivepower="0" locked="False" shaderlighting="None" />
+ <Add ref="#Material_u46806" locked="False" sourcepath="../maps/kmh260-w.png" subpresentation="" />
+ <Add ref="#gauges_u64198" name="gauges" endtime="24083" importfile="../models/gauges/gauges.import" position="-0.48343 1.982 0.287" rotation="0 0 -90" scale="1.6 2.3 2.3" sourcepath="../models/gauges/gauges.import" />
+ <Add ref="#Automotive_Gauges_u40684" endtime="24083" importfile="../models/gauges/gauges.import" rotation="0 0 0" />
+ <Add ref="#white_u17128" name="chromeMat" diffuse="0 0 0 1" specularreflection="#white_animatable_u30006" speculartint="1 1 1 1" />
+ <Add ref="#white_animatable_u30006" mappingmode="Environmental Mapping" sourcepath="../maps/chromeMap.jpg" subpresentation="" />
+ <Add ref="#glass1_u2633" endtime="24083" importfile="../models/gauges/gauges.import" />
+ <Add ref="#Material_001_animatable_u26559" name="glassMat" blendmode="Normal" bumpamount="0.5" diffuse="1 1 1 1" diffuselightwrap="0" diffusemap="#Material_001_animatable_001_u39339" displaceamount="20" emissivecolor="1 1 1 1" emissivepower="0" fresnelPower="0" importfile="../models/gauges/gauges.import" importid="Material_001" ior="1.5" opacity="15" shaderlighting="Pixel" sourcepath="" specularamount="2" specularmap="#Material_001_animatable_001_u5115" specularmodel="Default" specularroughness="1" speculartint="1 1 1 1" translucentfalloff="1" type="Material" vertexcolors="False" />
+ <Add ref="#Material_001_animatable_001_u5115" sourcepath="../maps/Glass-alpha05.png" subpresentation="" />
+ <Add ref="#Material_001_animatable_001_u39339" sourcepath="../maps/Glass-alpha05.png" subpresentation="" />
+ <Add ref="#roundbg_1_u11102" name="roundbg_1_wh" controlledproperty="$lightThemeVisible eyeball" endtime="24083" importfile="models/roundbg_1/roundbg_1.import" locked="False" position="0 -0.002 0" scale="0.89 0.9 0.89" sourcepath="../models/roundbg_1/roundbg_1.import" />
+ <Add ref="#qt_gauge_background_round_1_u2033" controlledproperty="$lightThemeVisible eyeball" endtime="24083" importfile="models/roundbg_1/roundbg_1.import" locked="False" />
+ <Add ref="#background_1_u25822" name="background_1" endtime="24083" referencedmaterial="#background_1_u45992" />
+ <Add ref="#tickmark_8_small_u23239" name="tickmark_8_smallWh" controlledproperty="$lightThemeVisible eyeball" endtime="24083" importfile="models/tickmark_8_small/tickmark_8_small.import" locked="False" position="0 -0.001 0" scale="1.28 1.28 1.3" sourcepath="../models/tickmark_8_small/tickmark_8_small.import" />
+ <Add ref="#qt_gauge_tickmarks_8_small_u61469" endtime="24083" importfile="models/tickmark_8_small/tickmark_8_small.import" locked="False" />
+ <Add ref="#Default_u1934" name="Default_black" blendmode="Normal" bumpamount="0.5" diffuse="0 0 0 1" diffuselightwrap="0" displaceamount="20" emissivecolor="1 1 1 1" emissivepower="0" fresnelPower="0" importfile="" importid="" ior="1.5" opacity="100" shaderlighting="None" sourcepath="" specularamount="0" specularmodel="Default" specularroughness="0" speculartint="1 1 1 1" translucentfalloff="1" type="Material" vertexcolors="False" />
+ <Add ref="#Rpm7_u41311" name="Rpm7_wh" controlledproperty="$lightThemeVisible eyeball" endtime="24083" locked="False" position="1.774 4.308 -0.001" scale="1.24 1.24 1.24" sourcepath="#Rectangle" />
+ <Add ref="#Material_u46848" controlledproperty="" diffusemap="#Material_001_u473" locked="False" shaderlighting="None" />
+ <Add ref="#Material_001_u473" locked="False" sourcepath="../maps/Rpm7-w.png" subpresentation="" />
+ </State>
+ </State>
+ <State name="Master Slide" component="#GaugeNeedle_u7157" >
+ <Add ref="#GaugeNeedle_u56675" name="GaugeNeedle" controlledproperty="" endtime="3000" position="0 3 1.31134e-07" rotation="0 -136 0" scale="0.9 0.9 0.9" />
+ <Add ref="#needle_u24306" name="needle_2" controlledproperty="" endtime="3000" importfile="models/needle_2/needle_2.import" rotation="0 1856 0" sourcepath="../models/needle_2/needle_2.import" />
+ <Add ref="#qt_gauge_needles_u26269" endtime="3000" importfile="models/needle_2/needle_2.import" rotation="0 2575 0" />
+ <Add ref="#qt_gauge_needles:red_u52137" blendmode="Normal" diffuse="0.666667 0 0 1" emissivecolor="1 1 1 1" importfile="models/needle_2/needle_2.import" shaderlighting="None" specularroughness="1" />
+ <Add ref="#qt_gauge_needles:black_u14627" diffuse="0.34902 0.34902 0.34902 1" importfile="models/needle_2/needle_2.import" shaderlighting="Pixel" />
+ <Add ref="#qt_gauge_u63520" diffuse="0 0 0 1" importfile="models/needle_2/needle_2.import" specularamount="0.5" specularreflection="#qt_gauge_needles:solidWhite_u45933" vertexcolors="False" />
+ <Add ref="#qt_gauge_needles:solidWhite_u45933" mappingmode="Environmental Mapping" sourcepath="../maps/OpenfootageNET_garage-512.hdr" subpresentation="" />
+ <State id="GaugeNeedle-Slide1_u19461" name="Slide1" initialplaystate="Play" playmode="PingPong" />
+ </State>
+ <State name="Master Slide" component="#GaugeNeedle_u33184" playmode="PingPong" >
+ <Add ref="#GaugeNeedle_u58092" name="GaugeNeedle" controlledproperty="" endtime="3000" rotation="4.07111e-13 -136 4.07111e-13" scale="0.9 0.9 0.9" />
+ <Add ref="#needle_2_u61240" name="needle_2" controlledproperty="$rpmVectorQml rotation" endtime="3000" importfile="models/needle_2/needle_2.import" rotation="0 217 0" sourcepath="../models/needle_2/needle_2.import" />
+ <Add ref="#qt_gauge_needles_2_u17133" controlledproperty="" endtime="3000" importfile="models/needle_2/needle_2.import" />
+ <Add ref="#qt_gauge_needles:red_transparent_u41926" blendmode="Normal" controlledproperty="" diffuse="0.666667 0 0 1" importfile="models/needle_2/needle_2.import" shaderlighting="None" specularamount="0" speculartint="1 1 1 1" transparencymode="Default" />
+ <Add ref="#qt_gauge_needles:black_solid_u25928" diffuse="0.34902 0.34902 0.34902 1" importfile="models/needle_2/needle_2.import" shaderlighting="Pixel" />
+ <Add ref="#qt_gauge_needles:solidWhite_u26596" diffuse="0 0 0 1" importfile="models/needle_2/needle_2.import" specularamount="0.5" specularreflection="#qt_gauge_needles:solidWhite_001_u31188" vertexcolors="False" />
+ <Add ref="#qt_gauge_needles:solidWhite_001_u31188" mappingmode="Environmental Mapping" sourcepath="../maps/OpenfootageNET_garage-512.hdr" subpresentation="" />
+ <State id="GaugeNeedle-Slide1_u62154" name="Slide1" initialplaystate="Play" playmode="PingPong" >
+ <Set ref="#GaugeNeedle_u58092" endtime="7000" />
+ <Set ref="#needle_2_u61240" endtime="7000" />
+ <Set ref="#qt_gauge_needles_2_u17133" endtime="7000" />
+ </State>
+ </State>
+ </Logic>
+ <Guides >
+ <Guide direction="Vertical" position="40" width="1" />
+ <Guide direction="Vertical" position="1240" width="1" />
+ <Guide direction="Vertical" position="200" width="1" />
+ </Guides>
+ </Project>
</UIP>
diff --git a/apps/com.theqtcompany.cluster/helpers/Qt3DStudioAvailable.qml b/apps/com.theqtcompany.cluster/helpers/Qt3DStudioAvailable.qml
index 39586aad..a4146edd 100644
--- a/apps/com.theqtcompany.cluster/helpers/Qt3DStudioAvailable.qml
+++ b/apps/com.theqtcompany.cluster/helpers/Qt3DStudioAvailable.qml
@@ -28,7 +28,8 @@
** SPDX-License-Identifier: GPL-3.0
**
****************************************************************************/
-import QtStudio3D 2.1
+
+import QtStudio3D.OpenGL 2.5
import QtQuick 2.8
Item {}
diff --git a/apps/com.theqtcompany.cluster/info.yaml b/apps/com.theqtcompany.cluster/info.yaml
index bc92b692..2a2cb5dc 100644
--- a/apps/com.theqtcompany.cluster/info.yaml
+++ b/apps/com.theqtcompany.cluster/info.yaml
@@ -1,12 +1,8 @@
formatVersion: 1
-formatType: am-application
+formatType: am-package
---
id: 'com.theqtcompany.cluster'
icon: 'icon.png'
-code: 'Main.qml'
-runtime: 'qml'
-runtimeParameters:
- importPaths: [ '.' ]
name:
en: 'Instrument Cluster'
de: 'Instrumentengruppe'
@@ -16,8 +12,14 @@ name:
ja: '計器クラスタ'
ko: '계기판'
-applicationProperties:
- private:
+applications:
+ - id: 'com.theqtcompany.cluster'
+ code: 'Main.qml'
+ runtime: 'qml'
+ runtimeParameters:
+ importPaths: [ '.' ]
+ applicationProperties:
+ private:
squishPort: 7723
categories: [ 'cluster' ]
diff --git a/apps/com.theqtcompany.cluster/panels/+lucee/DialSpeedPanel.qml b/apps/com.theqtcompany.cluster/panels/+lucee/DialSpeedPanel.qml
index 57e283b3..93ca9790 100644
--- a/apps/com.theqtcompany.cluster/panels/+lucee/DialSpeedPanel.qml
+++ b/apps/com.theqtcompany.cluster/panels/+lucee/DialSpeedPanel.qml
@@ -91,6 +91,7 @@ Item {
actual rect showing
*/
DropShadow{
+ id: speedRectangleShadow
anchors.fill: speedRectangle
horizontalOffset: 0
verticalOffset: 0
@@ -105,6 +106,7 @@ Item {
speed label
*/
Label {
+ id: speedLabel
anchors.baseline: speedRectangle.baseline
anchors.baselineOffset: Sizes.dp(150)
anchors.horizontalCenter: speedRectangle.horizontalCenter
@@ -119,6 +121,7 @@ Item {
speed units label
*/
Label {
+ id: unitsLabel
anchors.horizontalCenter: speedRectangle.horizontalCenter
anchors.bottom: speedRectangle.bottom
anchors.bottomMargin: Sizes.dp(20)
@@ -174,4 +177,27 @@ Item {
valueUnits: root.mileageUnits
icon: Utils.localAsset("ic-distance", Style.theme)
}
+
+ state: "speed_center"
+ states: [
+ State {
+ // "Cluster with app" mode, turn on when app is shown in the cluster
+ name: "speed_right"
+ PropertyChanges { target: speedRectangle;
+ x: rtlMode ? root.screenCenter.x - speedRectangle.width / 2 - Sizes.dp(485) :
+ root.screenCenter.x - speedRectangle.width / 2 + Sizes.dp(485);
+ width: Sizes.dp(300); height: Sizes.dp(150); radius: Sizes.dp(37) }
+ PropertyChanges { target: speedLabel; font.pixelSize: Sizes.dp(100);
+ anchors.baselineOffset: Sizes.dp(100) }
+ PropertyChanges { target: unitsLabel; font.pixelSize: Sizes.dp(20);
+ anchors.bottomMargin: Sizes.dp(15) }
+ PropertyChanges { target: speedRectangleShadow; opacity: 0.8 }
+ }
+ ]
+
+ transitions: Transition {
+ NumberAnimation {
+ properties: "x,y,width,height,font.pixelSize,anchors.baselineOffset,radius,anchors.bottomMargin,opacity";
+ duration: 500; easing.type: Easing.InOutQuad }
+ }
}
diff --git a/apps/com.theqtcompany.cluster/panels/+lucee/GaugesPanel.qml b/apps/com.theqtcompany.cluster/panels/+lucee/GaugesPanel.qml
index cd2f4831..05c6966b 100644
--- a/apps/com.theqtcompany.cluster/panels/+lucee/GaugesPanel.qml
+++ b/apps/com.theqtcompany.cluster/panels/+lucee/GaugesPanel.qml
@@ -58,6 +58,7 @@ Item {
property int drivingModeRangeDistance
property int drivingModeECORangeDistance
property int drivingMode
+ property int clusterUIMode
/*!
Defines current state of right-to-left
@@ -69,6 +70,15 @@ Item {
onRtlModeChanged: d.restart()
Component.onCompleted: startDelay.start();
+ onClusterUIModeChanged: {
+ if (root.clusterUIMode === 0) {
+ //no app shown
+ dspeed.state = "speed_center"
+ } else {
+ //app (map, music, ...) in cluster -> move speed label right
+ dspeed.state = "speed_right"
+ }
+ }
//private
QtObject {
@@ -148,7 +158,6 @@ Item {
id: dspeed
width: parent.width / 2
height: parent.height
- state: parent.state
rtlMode: root.rtlMode
screenCenter: Qt.point(parent.width / 2 - x, parent.height / 2 - y)
}
diff --git a/apps/com.theqtcompany.cluster/panels/GaugesPanel.qml b/apps/com.theqtcompany.cluster/panels/GaugesPanel.qml
index f2fb556b..f8a71ae9 100644
--- a/apps/com.theqtcompany.cluster/panels/GaugesPanel.qml
+++ b/apps/com.theqtcompany.cluster/panels/GaugesPanel.qml
@@ -48,6 +48,7 @@ Item {
property alias cruiseSpeed: ds.cruiseSpeed
property alias drivetrain:dp.drivetrain
property alias ePower: dp.ePower
+ property int clusterUIMode // unused here
property bool rtlMode
onRtlModeChanged: d.restart()
diff --git a/apps/com.theqtcompany.cluster/panels/GaugesPanel3D.qml b/apps/com.theqtcompany.cluster/panels/GaugesPanel3D.qml
index b2affa2c..849a64c2 100644
--- a/apps/com.theqtcompany.cluster/panels/GaugesPanel3D.qml
+++ b/apps/com.theqtcompany.cluster/panels/GaugesPanel3D.qml
@@ -36,12 +36,10 @@ import shared.utils 1.0
import QtQuick.Shapes 1.12
import QtGraphicalEffects 1.0
import QtQuick.Controls 2.2
-import QtStudio3D 2.1
+import QtStudio3D.OpenGL 2.5
import "../helpers" 1.0
-
-
/*
\qmltype GaugesPanel
*/
@@ -66,6 +64,7 @@ Item {
property bool lightThemeVisible: Style.theme === Style.Light
property bool darkThemeVisible: Style.theme === Style.Dark
+ property int clusterUIMode // unused here
Component.onCompleted: startDelay.start();
@@ -85,10 +84,15 @@ Item {
Studio3D {
anchors.fill: parent
+ enabled: false
+ ViewerSettings {
+ scaleMode: ViewerSettings.ScaleModeFit
+// showRenderStats: true
+ }
+
Presentation {
id: presentation
- source: Utils.localQt3DStudioPresentationAsset("presentations/gauges.uip")
-
+ source: Utils.localQt3DStudioPresentationAsset("gauges.uia")
property int speedLimit: 70
property int speed: 59
property int rpm: 0
@@ -190,31 +194,19 @@ Item {
Connections {
target: root
- onLightThemeVisibleChanged: {
+ function onLightThemeVisibleChanged() {
if (!changeGaugesMainColorAnimation.running && !changeThemeAnimation.running) {
changeThemeAnimation.start()
}
}
- onGaugesMainColorChanged: {
+ function onGaugesMainColorChanged() {
if (!changeGaugesMainColorAnimation.running && !changeThemeAnimation.running) {
changeGaugesMainColorAnimation.start();
}
}
}
- Behavior on rpm {
- NumberAnimation { easing.type: Easing.OutExpo; duration: 400 }
- }
-
- Behavior on speed {
- NumberAnimation { easing.type: Easing.OutCubic; duration: 3000 }
- }
-
- Behavior on speedLimit {
- NumberAnimation { easing.type: Easing.OutCubic; duration: 5000 }
- }
-
onSpeedChanged: {
// here is a correspondence between gauge's degree and rpm:
// rpm | 0.5 | 1.0 | 1.5 | 2.0 | 2.5 | 3.0 | 3.5 | 4.0 | 4.5 | 5.0 | 6.0 |
@@ -254,7 +246,9 @@ Item {
DataInput {
name: "gaugesScale"
- value: Qt.vector3d(presentation.gaugesScale, presentation.gaugesScale, presentation.gaugesScale)
+ value: Qt.vector3d(presentation.gaugesScale
+ , presentation.gaugesScale
+ , presentation.gaugesScale)
}
DataInput {
@@ -279,7 +273,8 @@ Item {
DataInput {
name: "mainLightColor"
- value: root.gaugesMainColor
+ value: Qt.vector4d(root.gaugesMainColor.r, root.gaugesMainColor.g
+ ,root.gaugesMainColor.b, 1.0)
}
DataInput {
diff --git a/apps/com.theqtcompany.cluster/panels/SafeTelltalesPanel.qml b/apps/com.theqtcompany.cluster/panels/SafeTelltalesPanel.qml
index 5ca5a5df..49070570 100644
--- a/apps/com.theqtcompany.cluster/panels/SafeTelltalesPanel.qml
+++ b/apps/com.theqtcompany.cluster/panels/SafeTelltalesPanel.qml
@@ -89,7 +89,7 @@ Item {
runtimeEditable: true
font.bold: true
font.pixelSize: 40
- font.family: "Open Sans"
+ font.family: "DejaVu Sans"
visible: false
anchors.centerIn: root
horizontalAlignment: Text.AlignHCenter
@@ -110,7 +110,7 @@ Item {
color: "white"
font.bold: true
font.pixelSize: 40
- font.family: "Open Sans"
+ font.family: "DejaVu Sans"
visible: false
horizontalAlignment: Text.AlignHCenter
x: 221
@@ -127,7 +127,7 @@ Item {
runtimeEditable: true
font.bold: true
font.pixelSize: 80
- font.family: "Open Sans"
+ font.family: "DejaVu Sans"
visible: false
horizontalAlignment: Text.AlignHCenter
x: 191
@@ -141,7 +141,7 @@ Item {
color: "white"
font.bold: true
font.pixelSize: 40
- font.family: "Open Sans"
+ font.family: "DejaVu Sans"
text: "km/h"
visible: false
horizontalAlignment: Text.AlignHCenter
@@ -230,7 +230,7 @@ Item {
color: "white"
font.bold: true
font.pixelSize: 40
- font.family: "Open Sans"
+ font.family: "DejaVu Sans"
visible: false
horizontalAlignment: Text.AlignHCenter
x: 609
@@ -248,7 +248,7 @@ Item {
runtimeEditable: true
font.bold: true
font.pixelSize: 80
- font.family: "Open Sans"
+ font.family: "DejaVu Sans"
visible: false
horizontalAlignment: Text.AlignHCenter
x: 576
@@ -264,7 +264,7 @@ Item {
color: "white"
font.bold: true
font.pixelSize: 40
- font.family: "Open Sans"
+ font.family: "DejaVu Sans"
text: "%"
visible: false
horizontalAlignment: Text.AlignHCenter
diff --git a/apps/com.theqtcompany.cluster/stores/BehaviourInterface.qml b/apps/com.theqtcompany.cluster/stores/BehaviourInterface.qml
index 5d83db42..1ec57356 100644
--- a/apps/com.theqtcompany.cluster/stores/BehaviourInterface.qml
+++ b/apps/com.theqtcompany.cluster/stores/BehaviourInterface.qml
@@ -39,4 +39,12 @@ Store {
property bool navigationMode: false
property bool twentyFourHourTimeFormat: true // 24 hour vs am/pm
property bool qt3DStudioAvailable: false
+
+ /*
+ cluster UI mode
+ 0 - empty app (default)
+ 1 - app is shown behind gauges
+ 2 - navigation mode
+ */
+ property int clusterUIMode: 0
}
diff --git a/apps/com.theqtcompany.cluster/stores/RootStore.qml b/apps/com.theqtcompany.cluster/stores/RootStore.qml
index d437891d..b79886bb 100644
--- a/apps/com.theqtcompany.cluster/stores/RootStore.qml
+++ b/apps/com.theqtcompany.cluster/stores/RootStore.qml
@@ -30,9 +30,10 @@
****************************************************************************/
import QtQuick 2.8
+import QtApplicationManager.Application 2.0
import shared.com.pelagicore.remotesettings 1.0
import shared.com.pelagicore.drivedata 1.0
-import QtApplicationManager.Application 2.0
+import shared.com.pelagicore.systeminfo 1.0
/*!
\qmltype ClusterStore
@@ -50,6 +51,7 @@ RootStoreInterface {
readonly property UISettings uiSettings: UISettings {}
// true if QtSafeRenderer is enabled
readonly property bool qsrEnabled: ApplicationInterface.systemProperties["qsrEnabled"]
+ readonly property SystemInfo systemInfo: SystemInfo {}
vehicleInterface: VehicleInterface {
speed: clusterDataSource.speed
@@ -88,7 +90,8 @@ RootStoreInterface {
}
}
- threeDGauges: qt3DStudioAvailable && uiSettings.threeDGauges
+ threeDGauges: systemInfo.allow3dStudioPresentations && qt3DStudioAvailable
+ && uiSettings.threeDGauges
hideGauges: uiSettings.hideGauges
navigationMode: uiSettings.navigationMode
}
diff --git a/apps/com.theqtcompany.cluster/views/+lucee/ClusterView.qml b/apps/com.theqtcompany.cluster/views/+lucee/ClusterView.qml
index 02506d29..b4be0281 100644
--- a/apps/com.theqtcompany.cluster/views/+lucee/ClusterView.qml
+++ b/apps/com.theqtcompany.cluster/views/+lucee/ClusterView.qml
@@ -31,10 +31,9 @@
import QtQuick 2.8
import QtQuick.Window 2.2
+
import shared.com.pelagicore.remotesettings 1.0
-import application.windows 1.0
import shared.animations 1.0
-
import shared.Sizes 1.0
import shared.Style 1.0
@@ -85,6 +84,7 @@ Item {
mileage: store.vehicleInterface.mileage
mileageUnits: store.localization.mileageUnits
speedUnits: store.localization.speedUnits
+ clusterUIMode: store.behaviourInterface.clusterUIMode
Behavior on opacity {
DefaultNumberAnimation {}
diff --git a/apps/com.theqtcompany.cluster/views/ClusterView.qml b/apps/com.theqtcompany.cluster/views/ClusterView.qml
index 0642daae..958912d4 100644
--- a/apps/com.theqtcompany.cluster/views/ClusterView.qml
+++ b/apps/com.theqtcompany.cluster/views/ClusterView.qml
@@ -34,7 +34,7 @@
import QtQuick 2.8
import QtQuick.Window 2.2
import shared.com.pelagicore.remotesettings 1.0
-import application.windows 1.0
+//import application.windows 1.0
import shared.Sizes 1.0
import shared.Style 1.0
@@ -79,6 +79,7 @@ Item {
item.cruiseSpeed = Qt.binding( function() {return store.vehicleInterface.speedCruise})
item.ePower = Qt.binding( function() {return store.vehicleInterface.ePower})
item.drivetrain = Qt.binding( function() {return store.vehicleInterface.driveTrainState})
+ item.clusterUIMode = Qt.binding( function() {return store.behaviourInterface.clusterUIMode})
}
}
@@ -99,6 +100,7 @@ Item {
item.cruiseSpeed = Qt.binding( function() {return store.vehicleInterface.speedCruise})
item.ePower = Qt.binding( function() {return store.vehicleInterface.ePower})
item.drivetrain = Qt.binding( function() {return store.vehicleInterface.driveTrainState})
+ item.clusterUIMode = Qt.binding( function() {return store.behaviourInterface.clusterUIMode})
}
}
diff --git a/copydata.pro b/copydata.pro
index 043bffe5..c6e8454a 100644
--- a/copydata.pro
+++ b/copydata.pro
@@ -3,9 +3,13 @@ TEMPLATE = aux
# On a debug_and_release configuration, do the copying in the meta Makefile, not in the respective debug and release Makefiles
if(!debug_and_release | !build_pass) {
# Copy all QML files during the build time
- DIRECTORIES = apps dev/apps imports_shared imports_system sysui styles tests
+ DIRECTORIES = apps imports_shared imports_system sysui styles tests
FILES = am-config-neptune.yaml am-config-lucee.yaml Main.qml
+ # Special case for dev/apps folder as windows will put dev/apps into dev/apps in target folder
+ win32: do_copydata.commands += $(COPY_DIR) $$shell_path($$PWD/dev/apps) $$shell_path($$OUT_PWD/apps) $$escape_expand(\n\t)
+ else: do_copydata.commands += $(COPY_DIR) $$shell_path($$PWD/dev/apps) $$shell_path($$OUT_PWD) $$escape_expand(\n\t)
+
for (d , DIRECTORIES) {
win32: do_copydata.commands += $(COPY_DIR) $$shell_path($$PWD/$${d}) $$shell_path($$OUT_PWD/$${d}) $$escape_expand(\n\t)
else: do_copydata.commands += $(COPY_DIR) $$shell_path($$PWD/$${d}) $$shell_path($$OUT_PWD) $$escape_expand(\n\t)
diff --git a/dev/apps/com.pelagicore.sheets/components/ButtonPanel.qml b/dev/apps/com.pelagicore.sheets/components/ButtonPanel.qml
index b2e5295e..eab9f30e 100644
--- a/dev/apps/com.pelagicore.sheets/components/ButtonPanel.qml
+++ b/dev/apps/com.pelagicore.sheets/components/ButtonPanel.qml
@@ -59,14 +59,14 @@ Item {
implicitWidth: Sizes.dp(315)
implicitHeight: Sizes.dp(64)
font.pixelSize: Sizes.fontSizeS
- text: "This is a button"
+ text: qsTr("This is a button")
}
Button {
implicitWidth: Sizes.dp(315)
implicitHeight: Sizes.dp(64)
font.pixelSize: Sizes.fontSizeS
- text: "Disabled Button"
+ text: qsTr("Disabled Button")
enabled: false
}
@@ -74,7 +74,7 @@ Item {
implicitWidth: Sizes.dp(315)
implicitHeight: Sizes.dp(64)
font.pixelSize: Sizes.fontSizeS
- text: "Button Checkable"
+ text: qsTr("Button Checkable")
checkable: true
}
}
@@ -87,7 +87,7 @@ Item {
leftPadding: smallButtonPadding
rightPadding: smallButtonPadding
font.pixelSize: Sizes.fontSizeS
- text: "Small button"
+ text: qsTr("Small button")
}
Button {
implicitHeight: smallButtonHeight
@@ -95,7 +95,7 @@ Item {
leftPadding: smallButtonPadding
rightPadding: smallButtonPadding
font.pixelSize: Sizes.fontSizeS
- text: "Small button"
+ text: qsTr("Small button")
icon.name: "ic-steering-wheel-heat_OFF"
}
Button {
@@ -104,7 +104,7 @@ Item {
leftPadding: smallButtonPadding
rightPadding: smallButtonPadding
font.pixelSize: Sizes.fontSizeS
- text: "Checkable"
+ text: qsTr("Checkable")
icon.name: checked ? "ic-steering-wheel-heat_ON" : "ic-steering-wheel-heat_OFF"
checkable: true
}
@@ -112,7 +112,7 @@ Item {
RowLayout {
spacing: Sizes.dp(13)
Button {
- text: "Large button"
+ text: qsTr("Large button")
implicitHeight: largeButtonHeight
implicitWidth: Sizes.dp(315)
leftPadding: largeButtonPadding
@@ -126,7 +126,7 @@ Item {
leftPadding: largeButtonPadding
rightPadding: largeButtonPadding
font.pixelSize: Sizes.fontSizeS
- text: "Large button"
+ text: qsTr("Large button")
icon.name: "ic-steering-wheel-heat_OFF"
}
Button {
@@ -135,7 +135,7 @@ Item {
leftPadding: largeButtonPadding
rightPadding: largeButtonPadding
font.pixelSize: Sizes.fontSizeS
- text: "Checkable"
+ text: qsTr("Checkable")
icon.name: checked ? "ic-seat-heat-passenger_ON" : "ic-seat-heat-passenger_OFF"
checkable: true
}
@@ -144,7 +144,7 @@ Item {
spacing: Sizes.dp(13)
Label {
- text: "Custom background:"
+ text: qsTr("Custom background:")
}
Button {
@@ -171,7 +171,7 @@ Item {
opacity: 1
}
icon.name: "ic-seat-heat-passenger_OFF"
- text: "text"
+ text: qsTr("text")
font.pixelSize: Sizes.fontSizeS
display: AbstractButton.TextUnderIcon
spacing: 0
@@ -184,7 +184,7 @@ Item {
implicitWidth: Sizes.dp(500)
leftPadding: largeButtonPadding
rightPadding: largeButtonPadding
- text: "Wide button"
+ text: qsTr("Wide button")
font.pixelSize: Sizes.fontSizeS
icon.name: "ic-steering-wheel-heat_OFF"
}
@@ -194,7 +194,7 @@ Item {
leftPadding: largeButtonPadding
rightPadding: largeButtonPadding
font.pixelSize: Sizes.fontSizeS
- text: "Elide too long text"
+ text: qsTr("Elide too long text")
icon.name: "ic-steering-wheel-heat_OFF"
}
}
diff --git a/dev/apps/com.pelagicore.sheets/components/ListItemPanel.qml b/dev/apps/com.pelagicore.sheets/components/ListItemPanel.qml
index 39d3f38a..44fb59a4 100644
--- a/dev/apps/com.pelagicore.sheets/components/ListItemPanel.qml
+++ b/dev/apps/com.pelagicore.sheets/components/ListItemPanel.qml
@@ -62,21 +62,21 @@ Item {
ListItem {
implicitWidth: Sizes.dp(765)
implicitHeight: Sizes.dp(104)
- text: "Basic ListItem"
+ text: qsTr("Basic ListItem")
dividerVisible: false
}
ListItem {
implicitWidth: Sizes.dp(765)
implicitHeight: Sizes.dp(104)
- text: "ListItem Text"
+ text: qsTr("ListItem Text")
subText: "ListItem Subtext"
}
ListItem {
implicitWidth: Sizes.dp(765)
implicitHeight: Sizes.dp(104)
- text: "ListItem with an image"
+ text: qsTr("ListItem with an image")
icon.source: Style.image("fan-speed-5")
icon.color: "transparent"
}
@@ -85,15 +85,15 @@ Item {
implicitWidth: Sizes.dp(765)
implicitHeight: Sizes.dp(104)
icon.name: "ic-update"
- text: "ListItem with Icon"
+ text: qsTr("ListItem with Icon")
}
ListItem {
implicitWidth: Sizes.dp(765)
implicitHeight: Sizes.dp(104)
icon.name: "ic-update"
- text: "ListItem with Secondary Text"
- secondaryText: "Company"
+ text: qsTr("ListItem with Secondary Text")
+ secondaryText: qsTr("Company")
}
ListItem {
@@ -101,8 +101,8 @@ Item {
implicitHeight: Sizes.dp(104)
icon.name: "ic-update"
rightToolSymbol: "ic-close"
- text: "ListItem with Secondary Text"
- secondaryText: "68% of 14 MB"
+ text: qsTr("ListItem with Secondary Text")
+ secondaryText: qsTr("68% of 14 MB")
}
ListItem {
@@ -110,8 +110,8 @@ Item {
implicitHeight: Sizes.dp(104)
icon.name: "ic-update"
rightToolSymbol: "ic-close"
- text: "ListItem with Looooooooooonnngggg Text"
- secondaryText: "Loooooooong Secondary Text"
+ text: qsTr("ListItem with Looooooooooonnngggg Text")
+ secondaryText: qsTr("Loooooooong Secondary Text")
}
ListItemFlatButton {
@@ -119,8 +119,8 @@ Item {
implicitHeight: Sizes.dp(104)
icon.name: "ic-update"
subText: "subtitle"
- text: "ListItem with button"
- textFlatButton: "Show on map"
+ text: qsTr("ListItem with button")
+ textFlatButton: qsTr("Show on map")
closeButtonVisible: true
}
@@ -131,8 +131,8 @@ Item {
icon.name: "ic-update"
symbolFlatButton: Style.image("ic-favorite")
subText: "subtitle"
- text: "ListItem with button text"
- textFlatButton: "Text"
+ text: qsTr("ListItem with button text")
+ textFlatButton: qsTr("Text")
}
ListItemProgress {
@@ -142,8 +142,8 @@ Item {
minimumValue: 0
maximumValue: 100
icon.name: "ic-placeholder"
- text: "Downloading application"
- secondaryText: value + " % of 46 MB"
+ text: qsTr("Downloading application")
+ secondaryText: value + qsTr(" % of 46 MB")
cancelable: timerDowloading.running
value: 0
onProgressCanceled: {
@@ -175,7 +175,7 @@ Item {
indeterminate: true
icon.name: "ic-placeholder"
cancelable: indeterminate
- text: indeterminate ? "Downloading pending" : "Downloading canceled"
+ text: indeterminate ? qsTr("Downloading pending") : qsTr("Downloading canceled")
onProgressCanceled: indeterminate = false
onClicked: indeterminate = true
}
@@ -195,12 +195,12 @@ Item {
implicitWidth: Sizes.dp(765)
implicitHeight: Sizes.dp(104)
icon.name: "ic-placeholder"
- text: "List item with two accessory buttons"
+ text: qsTr("List item with two accessory buttons")
symbolAccessoryButton1: "ic-call-contrast"
symbolAccessoryButton2: "ic-message-contrast"
- onAccessoryButton1Clicked: listItemTwoButtons.text = "Call clicked"
- onAccessoryButton2Clicked: listItemTwoButtons.text = "Message clicked"
- onClicked: listItemTwoButtons.text = "List item with two accessory buttons"
+ onAccessoryButton1Clicked: listItemTwoButtons.text = qsTr("Call clicked")
+ onAccessoryButton2Clicked: listItemTwoButtons.text = qsTr("Message clicked")
+ onClicked: listItemTwoButtons.text = qsTr("List item with two accessory buttons")
}
}
}
diff --git a/dev/apps/com.pelagicore.sheets/components/NotificationPanel.qml b/dev/apps/com.pelagicore.sheets/components/NotificationPanel.qml
index ce8e80b4..5155df77 100644
--- a/dev/apps/com.pelagicore.sheets/components/NotificationPanel.qml
+++ b/dev/apps/com.pelagicore.sheets/components/NotificationPanel.qml
@@ -36,6 +36,7 @@ import QtQuick.Layouts 1.3
import shared.Sizes 1.0
import QtApplicationManager.Application 2.0
+import QtApplicationManager 2.0
Item {
id: root
@@ -48,56 +49,49 @@ Item {
Button {
id: simpleNotiButton
- width: Sizes.dp(500)
- height: Sizes.dp(64)
- text: "Simple notification"
- property var notification1: ApplicationInterface.createNotification();
+ implicitWidth: Sizes.dp(500)
+ implicitHeight: Sizes.dp(64)
+ text: qsTr("Simple notification")
onClicked: {
- notification1.summary = "Summary text: simple notification";
- notification1.body = "Body text: simple notification";
+ var notification1 = ApplicationInterface.createNotification();
+ notification1.summary = qsTr("Summary text: simple notification");
+ notification1.body = qsTr("Body text: simple notification");
notification1.showActionsAsIcons = true;
- notification1.actions = [{"actionText": "Action Text"}];
+ notification1.actions = [{"actionText": qsTr("Action Text")}];
notification1.show();
-
- }
- Connections {
- target: simpleNotiButton.notification1
- onActionTriggered: {
- console.log("Simple notification has been triggered")
- }
}
}
Button {
- width: Sizes.dp(500)
- height: Sizes.dp(64)
- text: "Timeout notification 8 secs"
+ implicitWidth: Sizes.dp(500)
+ implicitHeight: Sizes.dp(64)
+ text: qsTr("Timeout notification 8 secs")
onClicked: {
var notification2 = ApplicationInterface.createNotification();
- notification2.summary = "Summary text: timeout notification";
- notification2.body = "Body text: timeout 8 seconds";
+ notification2.summary = qsTr("Summary text: timeout notification");
+ notification2.body = qsTr("Body text: timeout 8 seconds");
notification2.timeout = 8000;
notification2.show();
}
}
Button {
- width: Sizes.dp(500)
- height: Sizes.dp(64)
- text: "Sticky notification"
+ implicitWidth: Sizes.dp(500)
+ implicitHeight: Sizes.dp(64)
+ text: qsTr("Sticky notification")
onClicked: {
var notification3 = ApplicationInterface.createNotification();
- notification3.summary = "Summary text: sticky notification";
- notification3.body = "Sticky notification has an implicit timeout of 0, it will persist in the notification center";
+ notification3.summary = qsTr("Summary text: sticky notification");
+ notification3.body = qsTr("Sticky notification has an implicit timeout of 0, it will persist in the notification center");
notification3.sticky = true;
notification3.show();
}
}
Button {
- width: Sizes.dp(500)
- height: Sizes.dp(64)
- text: "Long text notification"
+ implicitWidth: Sizes.dp(500)
+ implicitHeight: Sizes.dp(64)
+ text: qsTr("Long text notification")
onClicked: {
var notification4 = ApplicationInterface.createNotification();
notification4.summary = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Illa sunt similia: hebes acies est cuipiam oculorum, corpore alius senescit; Negat esse eam, inquit, propter se expetendam. Quoniam, si dis placet, ab Epicuro loqui discimus. At, illa, ut vobis placet, partem quandam tuetur, reliquam deserit. Scaevola tribunus plebis ferret ad plebem vellentne de ea re quaeri.";
@@ -111,9 +105,9 @@ Item {
// if not, a warning notification will be shown and stored in the notification center
Button {
id: appRequestNotiButton
- width: Sizes.dp(500)
- height: Sizes.dp(64)
- text: "Notification w/ App Request"
+ implicitWidth: Sizes.dp(500)
+ implicitHeight: Sizes.dp(64)
+ text: qsTr("Notification w/ App Request")
property var notification5: ApplicationInterface.createNotification();
onClicked: {
notification5.summary = qsTr("Battery level is low");
@@ -125,12 +119,12 @@ Item {
}
Connections {
target: appRequestNotiButton.notification5
- onActionTriggered: {
- //jump to navigation app
- Qt.openUrlExternally("x-map://getMeTo/Polis Park Kaningos Athens");
+ function onActionTriggered() {
+ IntentClient.sendIntentRequest("show-destination", "com.pelagicore.map"
+ , {"destination": "Polis Park Kaningos Athens"});
appRequestNotiButton.notification5.actionAccepted = true;
}
- onVisibleChanged: {
+ function onVisibleChanged() {
if (!appRequestNotiButton.notification5.visible && !appRequestNotiButton.notification5.actionAccepted) {
//if action is not accepted, show warning
// it's sticky, so first hide it to be able to show it again
diff --git a/dev/apps/com.pelagicore.sheets/components/PopupsPanel.qml b/dev/apps/com.pelagicore.sheets/components/PopupsPanel.qml
index 36f00d2b..9cbd9711 100644
--- a/dev/apps/com.pelagicore.sheets/components/PopupsPanel.qml
+++ b/dev/apps/com.pelagicore.sheets/components/PopupsPanel.qml
@@ -52,12 +52,18 @@ Item {
width: Sizes.dp(300)
height: Sizes.dp(200)
anchors.centerIn: parent
- text: "ListView Popup"
+ text: qsTr("ListView Popup")
onClicked: {
- var pos = this.mapToItem(root.parent, this.width/2, this.height/2);
- popupWithList.originItemX = pos.x;
- popupWithList.originItemY = pos.y;
- popupWithList.popupY = Math.round(Config.centerConsoleHeight / 4)
+ popupWithList.width = Qt.binding(() => Sizes.dp(910))
+ popupWithList.height = Qt.binding(() => Sizes.dp(450))
+
+ popupWithList.originItemX = Qt.binding(() => Sizes.dp(Config.centerConsoleWidth / 2));
+ popupWithList.originItemY = Qt.binding(() => Sizes.dp(Config.centerConsoleHeight / 2));
+
+ popupWithList.popupY = Qt.binding(() => {
+ return Sizes.dp(Config.centerConsoleHeight / 2) - popupWithList.height / 2;
+ });
+
popupWithList.visible = true;
}
}
@@ -65,8 +71,9 @@ Item {
PopupWithList {
id: popupWithList
- width: Sizes.dp(910)
- height: Sizes.dp(450)
+ // have to forward scale from root item as PopupWithList is a Window, not an Item,
+ // so value propagation doesn't quite apply
+ Sizes.scale: root.Sizes.scale
}
}
diff --git a/dev/apps/com.pelagicore.sheets/components/ProgressBarPanel.qml b/dev/apps/com.pelagicore.sheets/components/ProgressBarPanel.qml
index db7cb0f0..7e7cb3d8 100644
--- a/dev/apps/com.pelagicore.sheets/components/ProgressBarPanel.qml
+++ b/dev/apps/com.pelagicore.sheets/components/ProgressBarPanel.qml
@@ -47,7 +47,7 @@ Item {
Label {
font.pixelSize: Sizes.fontSizeS
- text: "Simple ProgressBar with background"
+ text: qsTr("Simple ProgressBar with background")
}
ProgressBar {
@@ -66,7 +66,7 @@ Item {
Label {
font.pixelSize: Sizes.fontSizeS
- text: "Indeterminate ProgressBar with background"
+ text: qsTr("Indeterminate ProgressBar with background")
}
ProgressBar {
@@ -86,7 +86,7 @@ Item {
Label {
font.pixelSize: Sizes.fontSizeS
- text: "Simple ProgressBar no background"
+ text: qsTr("Simple ProgressBar no background")
}
ProgressBar {
@@ -107,7 +107,7 @@ Item {
Label {
font.pixelSize: Sizes.fontSizeS
- text: "Indeterminate ProgressBar no background"
+ text: qsTr("Indeterminate ProgressBar no background")
}
ProgressBar {
diff --git a/dev/apps/com.pelagicore.sheets/components/SliderPanel.qml b/dev/apps/com.pelagicore.sheets/components/SliderPanel.qml
index 6de43d37..5457898d 100644
--- a/dev/apps/com.pelagicore.sheets/components/SliderPanel.qml
+++ b/dev/apps/com.pelagicore.sheets/components/SliderPanel.qml
@@ -44,7 +44,7 @@ Item {
anchors.horizontalCenter: parent.horizontalCenter
spacing: Sizes.dp(10)
Label {
- text: "Vertical / Horizontal sliders"
+ text: qsTr("Vertical / Horizontal sliders")
}
Row {
anchors.horizontalCenter: parent.horizontalCenter
@@ -67,7 +67,7 @@ Item {
}
}
Label {
- text: "Vertical / Horizontal stepper sliders"
+ text: qsTr("Vertical / Horizontal stepper sliders")
}
Row {
anchors.horizontalCenter: parent.horizontalCenter
diff --git a/dev/apps/com.pelagicore.sheets/components/ToolButtonPanel.qml b/dev/apps/com.pelagicore.sheets/components/ToolButtonPanel.qml
index e1556016..b815cce8 100644
--- a/dev/apps/com.pelagicore.sheets/components/ToolButtonPanel.qml
+++ b/dev/apps/com.pelagicore.sheets/components/ToolButtonPanel.qml
@@ -46,28 +46,28 @@ GridLayout {
icon.name: "ic-close"
}
Label {
- text: "Icon only"
+ text: qsTr("Icon only")
font.pixelSize: Sizes.fontSizeS
}
ToolButton {
Layout.alignment: Qt.AlignCenter
icon.name: "ic_back"
- text: "Back"
+ text: qsTr("Back")
}
Label {
- text: "Icon with text"
+ text: qsTr("Icon with text")
font.pixelSize: Sizes.fontSizeS
}
ToolButton {
Layout.alignment: Qt.AlignCenter
icon.name: "ic-update"
- text: "Update"
+ text: qsTr("Update")
display: AbstractButton.TextUnderIcon
}
Label {
- text: "Icon with text below"
+ text: qsTr("Icon with text below")
font.pixelSize: Sizes.fontSizeS
}
@@ -76,11 +76,11 @@ GridLayout {
checkable: true
checked: true
icon.name: checked ? "ic-color_ON" : "ic-color_OFF"
- text: "Color"
+ text: qsTr("Color")
display: AbstractButton.TextUnderIcon
}
Label {
- text: "Checkable tool button, icon + text below"
+ text: qsTr("Checkable tool button, icon + text below")
font.pixelSize: Sizes.fontSizeS
}
@@ -90,11 +90,11 @@ GridLayout {
checked: true
icon.name: checked ? "ic-themes_ON" : "ic-themes_OFF"
icon.color: "green"
- text: "Green"
+ text: qsTr("Green")
display: AbstractButton.TextUnderIcon
}
Label {
- text: "Checkable tool button, custom colored icon"
+ text: qsTr("Checkable tool button, custom colored icon")
font.pixelSize: Sizes.fontSizeS
}
@@ -105,7 +105,7 @@ GridLayout {
icon.height: Sizes.dp(16)
}
Label {
- text: "Custom icon size"
+ text: qsTr("Custom icon size")
font.pixelSize: Sizes.fontSizeS
}
diff --git a/dev/apps/com.pelagicore.sheets/info.yaml b/dev/apps/com.pelagicore.sheets/info.yaml
index 3308a54d..8b3b80fa 100644
--- a/dev/apps/com.pelagicore.sheets/info.yaml
+++ b/dev/apps/com.pelagicore.sheets/info.yaml
@@ -1,10 +1,8 @@
formatVersion: 1
-formatType: am-application
+formatType: am-package
---
id: 'com.pelagicore.sheets'
icon: 'icon.png'
-code: 'Main.qml'
-runtime: 'qml'
name:
en: 'Sheets'
de: 'Sheets'
@@ -14,4 +12,9 @@ name:
ja: 'Sheets'
ko: 'Sheets'
+applications:
+ - id: 'com.pelagicore.sheets'
+ code: 'Main.qml'
+ runtime: 'qml'
+
categories: [ 'dev' ]
diff --git a/dev/apps/com.pelagicore.sheets/popups/PopupWithList.qml b/dev/apps/com.pelagicore.sheets/popups/PopupWithList.qml
index 1c49a222..7b23b3d3 100644
--- a/dev/apps/com.pelagicore.sheets/popups/PopupWithList.qml
+++ b/dev/apps/com.pelagicore.sheets/popups/PopupWithList.qml
@@ -44,14 +44,15 @@ PopupWindow {
property var model: [{"text": "Purple"}, {"text" : "Deep blue"}, {"text" : "Violet"}]
Item {
- anchors.fill: parent
+ width: root.width
+ height: root.height
Label {
anchors.baseline: parent.top
anchors.baselineOffset: Sizes.dp(78)
font.pixelSize: Sizes.fontSizeM
width: parent.width
- text: "Choose color"
+ text: qsTr("Choose color")
horizontalAlignment: Text.AlignHCenter
}
Image {
diff --git a/doc/src/examples-parking-app-tutorial.qdoc b/doc/src/examples-parking-app-tutorial.qdoc
index e07177ca..71a64273 100644
--- a/doc/src/examples-parking-app-tutorial.qdoc
+++ b/doc/src/examples-parking-app-tutorial.qdoc
@@ -226,7 +226,7 @@ created, it's shown for a few seconds on top of the UI. If that notification is
stored in the notification center afterwards. The user can then decide to keep these notifications
or remove each of them.
-\image center-stack-notification-center.jpg
+\image center-stack-notification-center.png
To create a notification, first, you need to import QtApplicationManager 2.0. Then, you can create
a Notification object as part of the Parking App. Suppose you want to inform the user that the
diff --git a/doc/src/images/alexa-status-bar-button.png b/doc/src/images/alexa-status-bar-button.png
new file mode 100644
index 00000000..bf42d055
--- /dev/null
+++ b/doc/src/images/alexa-status-bar-button.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f3e29ce38e6ebf3a77d13008d32e48d9ffd4e36cb2fa15b238b61a3b0efb4464
+size 75878
diff --git a/doc/src/images/app-launcher-downloads.png b/doc/src/images/app-launcher-downloads.png
new file mode 100644
index 00000000..7a176e59
--- /dev/null
+++ b/doc/src/images/app-launcher-downloads.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:db96d87a26b98956c4ee045ca62c9da10a12f7d1ba25b4c0a10d5868928dd6a2
+size 74205
diff --git a/doc/src/images/app-launcher-downloads2.png b/doc/src/images/app-launcher-downloads2.png
new file mode 100644
index 00000000..acca0865
--- /dev/null
+++ b/doc/src/images/app-launcher-downloads2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6313a8c41bb576f000dfaf21771f0df620c747a3a65f064a7d6ec5a87b244e50
+size 235774
diff --git a/doc/src/images/arrow_bc.png b/doc/src/images/arrow_bc.png
new file mode 100644
index 00000000..d505fb1a
--- /dev/null
+++ b/doc/src/images/arrow_bc.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:607f6b2a66760be49d621e19a6164eb9d3487f12fc148382e07b7f598366b3f3
+size 1071
diff --git a/doc/src/images/bgrContent.png b/doc/src/images/bgrContent.png
new file mode 100644
index 00000000..23bd6613
--- /dev/null
+++ b/doc/src/images/bgrContent.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:32aa1c0d48132615c8921052bca5c17c405142ada1784ad7ad193e4cd5f87896
+size 149
diff --git a/doc/src/images/btn_next.png b/doc/src/images/btn_next.png
new file mode 100644
index 00000000..9366f7c8
--- /dev/null
+++ b/doc/src/images/btn_next.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0c4151ddc486972d7608e1bbc454bd54f66513cc8e70a490f263b28de12d8731
+size 695
diff --git a/doc/src/images/btn_prev.png b/doc/src/images/btn_prev.png
new file mode 100644
index 00000000..e4f32bd2
--- /dev/null
+++ b/doc/src/images/btn_prev.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:95a8b2eda14c743c0ba85356bdf1363fec0c1a05eee61d4c0c17a75599711751
+size 687
diff --git a/doc/src/images/bullet_dn.png b/doc/src/images/bullet_dn.png
new file mode 100644
index 00000000..9f52c351
--- /dev/null
+++ b/doc/src/images/bullet_dn.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:caca8e8597829bca12ca7234642f6dea9ef160651ac74fce61b4cffb89a62d8a
+size 230
diff --git a/doc/src/images/bullet_sq.png b/doc/src/images/bullet_sq.png
new file mode 100644
index 00000000..f71a9656
--- /dev/null
+++ b/doc/src/images/bullet_sq.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bba29f8c0f23e2b33d55c4fab7bf6d94930b2c7818d6a37d55c0e1946c0f24b3
+size 74
diff --git a/doc/src/images/center-stack-add-widget.jpg b/doc/src/images/center-stack-add-widget.jpg
deleted file mode 100644
index cefc5f33..00000000
--- a/doc/src/images/center-stack-add-widget.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/center-stack-add-widget.png b/doc/src/images/center-stack-add-widget.png
new file mode 100644
index 00000000..6e3afbb3
--- /dev/null
+++ b/doc/src/images/center-stack-add-widget.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c6b0f50d9e01d4be6c331a7e0eed99ff2fb339b62246c0ed8a900fabe2f2b5fd
+size 64864
diff --git a/doc/src/images/center-stack-app-launcher.jpg b/doc/src/images/center-stack-app-launcher.jpg
deleted file mode 100644
index 16e6e835..00000000
--- a/doc/src/images/center-stack-app-launcher.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/center-stack-app-launcher.png b/doc/src/images/center-stack-app-launcher.png
new file mode 100644
index 00000000..0c6d8b15
--- /dev/null
+++ b/doc/src/images/center-stack-app-launcher.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d2d3bc22410c2d5bd7ed75ab7ae2ff3e1b66ce30f7687996c2f89bbeaf46939b
+size 152668
diff --git a/doc/src/images/center-stack-climate.jpg b/doc/src/images/center-stack-climate.jpg
deleted file mode 100644
index d1f84b62..00000000
--- a/doc/src/images/center-stack-climate.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/center-stack-climate.png b/doc/src/images/center-stack-climate.png
new file mode 100644
index 00000000..09ae4d2b
--- /dev/null
+++ b/doc/src/images/center-stack-climate.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5fb23f5569263ffdc14236ee65419d2fad9b67972f846fae3b15d1eb6956e243
+size 62728
diff --git a/doc/src/images/center-stack-max-app-from-widget.png b/doc/src/images/center-stack-max-app-from-widget.png
new file mode 100644
index 00000000..271d2b54
--- /dev/null
+++ b/doc/src/images/center-stack-max-app-from-widget.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eea21e5d962a6413b1b677cf7b3fdb2b91b7c9ffe9f23df3540b397116359d27
+size 149115
diff --git a/doc/src/images/center-stack-maximized-app-home.png b/doc/src/images/center-stack-maximized-app-home.png
new file mode 100644
index 00000000..453c1e73
--- /dev/null
+++ b/doc/src/images/center-stack-maximized-app-home.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8253eb9bee15fa9f7ece554c4618ecec3dcf92b0396ae0a38a5621c9347fe0fd
+size 210964
diff --git a/doc/src/images/center-stack-maximized-app.jpg b/doc/src/images/center-stack-maximized-app.jpg
deleted file mode 100644
index 068ff8b7..00000000
--- a/doc/src/images/center-stack-maximized-app.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/center-stack-maximized-app.png b/doc/src/images/center-stack-maximized-app.png
new file mode 100644
index 00000000..2be0153c
--- /dev/null
+++ b/doc/src/images/center-stack-maximized-app.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a63b59c0bcf41e42f6887f39daeebfed1f48ebac978d7b331d78233f8457b6d8
+size 174661
diff --git a/doc/src/images/center-stack-nav.jpg b/doc/src/images/center-stack-nav.jpg
deleted file mode 100644
index c21506df..00000000
--- a/doc/src/images/center-stack-nav.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/center-stack-nav.png b/doc/src/images/center-stack-nav.png
new file mode 100644
index 00000000..bc2ae36e
--- /dev/null
+++ b/doc/src/images/center-stack-nav.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9d78eae92f7cf44ff9faf8193ab855a5bebe9db1063768eab10df43baf92e0d1
+size 207997
diff --git a/doc/src/images/center-stack-notification-center.jpg b/doc/src/images/center-stack-notification-center.jpg
deleted file mode 100644
index 5beb4c09..00000000
--- a/doc/src/images/center-stack-notification-center.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/center-stack-notification-center.png b/doc/src/images/center-stack-notification-center.png
new file mode 100644
index 00000000..9c5b30aa
--- /dev/null
+++ b/doc/src/images/center-stack-notification-center.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:021db91872c566fdb487966ce1ae98d782d5ae63f1647a4bfcb08346a231f65a
+size 203344
diff --git a/doc/src/images/center-stack-resize-widget.png b/doc/src/images/center-stack-resize-widget.png
new file mode 100644
index 00000000..3f20ed30
--- /dev/null
+++ b/doc/src/images/center-stack-resize-widget.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0de130d78a45bc156058eb2ad1d81fbd774229398e3f71ce829a91249c259207
+size 150376
diff --git a/doc/src/images/center-stack.jpg b/doc/src/images/center-stack.jpg
deleted file mode 100644
index 60b011b9..00000000
--- a/doc/src/images/center-stack.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/center-stack.png b/doc/src/images/center-stack.png
new file mode 100644
index 00000000..4ddff83a
--- /dev/null
+++ b/doc/src/images/center-stack.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2f620eae4585b18692e98674aa84772ea493abd4a616e3b144af640512acb504
+size 133284
diff --git a/doc/src/images/cluster-app-car.png b/doc/src/images/cluster-app-car.png
new file mode 100644
index 00000000..31c84655
--- /dev/null
+++ b/doc/src/images/cluster-app-car.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:896a1c1544f86eede988cca9e4eb33c96f5ae2b83615ff67ec6fb2c1ba9af8b4
+size 191470
diff --git a/doc/src/images/cluster-app-main.png b/doc/src/images/cluster-app-main.png
new file mode 100644
index 00000000..c94e00ad
--- /dev/null
+++ b/doc/src/images/cluster-app-main.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f742600a38686a5e8ca5809f94f914d6535677674c16040149601ef9d24ba8b7
+size 226186
diff --git a/doc/src/images/cluster-app-map.png b/doc/src/images/cluster-app-map.png
new file mode 100644
index 00000000..c41dfab5
--- /dev/null
+++ b/doc/src/images/cluster-app-map.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ff7c6461e5a6fa6dd3aeaade0dd005771356407d48c26ed10619077522a06b3c
+size 167635
diff --git a/doc/src/images/cluster-app-music.png b/doc/src/images/cluster-app-music.png
new file mode 100644
index 00000000..8c077964
--- /dev/null
+++ b/doc/src/images/cluster-app-music.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:272204a2ac033a5708e5a1a94bfafb744f5d61e4de57671ef5961e1a4e5e0194
+size 152571
diff --git a/doc/src/images/companion-app.png b/doc/src/images/companion-app.png
new file mode 100644
index 00000000..d0c6f659
--- /dev/null
+++ b/doc/src/images/companion-app.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6ed3f65e97fc5ee92542add82a5b6affbdbe930db020cc24d4c0663f444e0270
+size 157166
diff --git a/doc/src/images/desktop_startup.png b/doc/src/images/desktop_startup.png
new file mode 100644
index 00000000..5beac17f
--- /dev/null
+++ b/doc/src/images/desktop_startup.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b9f195e0169550fbc1d937008f1d4df93cb66f9dfbd28a56c9f7313c70f0912a
+size 376882
diff --git a/doc/src/images/first-integration.png b/doc/src/images/first-integration.png
index 2744dc11..52ce8c8b 100644
--- a/doc/src/images/first-integration.png
+++ b/doc/src/images/first-integration.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:068ed9fb5f5f8b254bf862445346748b2a8d7ab9cc6d5e060cf2c439513bb69b
-size 184330
+oid sha256:64e9cb49728d73a6dd76221e4441177868b6009d6fb7d3d7e100a2fb70d345e0
+size 183250
diff --git a/doc/src/images/home.png b/doc/src/images/home.png
new file mode 100644
index 00000000..07f0bb6c
--- /dev/null
+++ b/doc/src/images/home.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bce73b47e9e5c7a90121ee8414046b380b0c84144194f3fc493d37025661215e
+size 1076
diff --git a/doc/src/images/ico_note.png b/doc/src/images/ico_note.png
new file mode 100644
index 00000000..ee4fb91a
--- /dev/null
+++ b/doc/src/images/ico_note.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:28c8dff65b8e6b19d50f597e254a0f943740f742183310fe8d5be7edcbd343c1
+size 649
diff --git a/doc/src/images/ico_note_attention.png b/doc/src/images/ico_note_attention.png
new file mode 100644
index 00000000..3099163f
--- /dev/null
+++ b/doc/src/images/ico_note_attention.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b75fcddaaf182c8f3a9a93f51394049b34513e55cf194e1683f95ee7ff586526
+size 529
diff --git a/doc/src/images/ico_out.png b/doc/src/images/ico_out.png
new file mode 100644
index 00000000..dd5096ce
--- /dev/null
+++ b/doc/src/images/ico_out.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c9901b1ec9cc2569c1f43b679e715b6aa3bf28c86575de539f6203ec3a059410
+size 388
diff --git a/doc/src/images/instrument-cluster-3d-navi.png b/doc/src/images/instrument-cluster-3d-navi.png
index 97bd1634..cf638c3c 100644
--- a/doc/src/images/instrument-cluster-3d-navi.png
+++ b/doc/src/images/instrument-cluster-3d-navi.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:460e1e3a0523544685b1d5c05daa62f09241c2a2bc43c63c1725d4dd6c10f0c3
-size 1059738
+oid sha256:470cbeecad8b62bbaee3a2435cbd3329629af8700c4729a381dc516249ac5f42
+size 422816
diff --git a/doc/src/images/instrument-cluster-3d.png b/doc/src/images/instrument-cluster-3d.png
index 8f4762f5..23fbf26b 100644
--- a/doc/src/images/instrument-cluster-3d.png
+++ b/doc/src/images/instrument-cluster-3d.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2874087bcb3d34aafc5e0cfb75a48213b520c06f799d154d9dbde7cf880fa9cf
-size 1131712
+oid sha256:01fd003445a851bfb3619282403ba6c80a97eb4c298316ebd2fd0047360ad35c
+size 477977
diff --git a/doc/src/images/instrument-cluster-nav.jpg b/doc/src/images/instrument-cluster-nav.jpg
deleted file mode 100644
index b8fa22ca..00000000
--- a/doc/src/images/instrument-cluster-nav.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/instrument-cluster-nav.png b/doc/src/images/instrument-cluster-nav.png
new file mode 100644
index 00000000..0fdc4a7d
--- /dev/null
+++ b/doc/src/images/instrument-cluster-nav.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c90399ca73ab3211479674bde3fc6aab3dc5cf5cf2e976f12901221e149a79ab
+size 350763
diff --git a/doc/src/images/instrument-cluster-tt.png b/doc/src/images/instrument-cluster-tt.png
new file mode 100644
index 00000000..02fdbc9b
--- /dev/null
+++ b/doc/src/images/instrument-cluster-tt.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bffa99182189393f1250721eb965379b6012e86be87efd598c462972ba09f079
+size 403747
diff --git a/doc/src/images/instrument-cluster-vehicle.png b/doc/src/images/instrument-cluster-vehicle.png
index 933959ad..ad7d390d 100644
--- a/doc/src/images/instrument-cluster-vehicle.png
+++ b/doc/src/images/instrument-cluster-vehicle.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ef870b3a08f6f89542271eb99edcc96e5d63db78e96e8d1a39d237171a563422
-size 1180286
+oid sha256:465bce0f29776c52a7c90b88137e9253579f839ef0ef564dd332d2ae8eb780f2
+size 375761
diff --git a/doc/src/images/instrument-cluster.jpg b/doc/src/images/instrument-cluster.jpg
deleted file mode 100644
index 495edbe7..00000000
--- a/doc/src/images/instrument-cluster.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/instrument-cluster.png b/doc/src/images/instrument-cluster.png
new file mode 100644
index 00000000..b451e2a9
--- /dev/null
+++ b/doc/src/images/instrument-cluster.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c7ff1ed87c44e7c4e65f1c59d2367ca3ce81275cb1eebdb7f3bc991eddab75e1
+size 350572
diff --git a/doc/src/images/logo.png b/doc/src/images/logo.png
new file mode 100644
index 00000000..b056b74a
--- /dev/null
+++ b/doc/src/images/logo.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4bbe72713fa329c43b762b583d2933895a50c9b135e5b5f632574b306ca19ba1
+size 2370
diff --git a/doc/src/images/music-app-popup.jpg b/doc/src/images/music-app-popup.jpg
deleted file mode 100644
index 56812ece..00000000
--- a/doc/src/images/music-app-popup.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/music-app-popup.png b/doc/src/images/music-app-popup.png
new file mode 100644
index 00000000..41993c5e
--- /dev/null
+++ b/doc/src/images/music-app-popup.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:df9bcf7817e988d76592f353df8c80ba763337f845d43fbc89d091a00be649e1
+size 79235
diff --git a/doc/src/images/neptune-dark-theme1.jpg b/doc/src/images/neptune-dark-theme1.jpg
deleted file mode 100644
index 1f3a243c..00000000
--- a/doc/src/images/neptune-dark-theme1.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/neptune-dark-theme2.jpg b/doc/src/images/neptune-dark-theme2.jpg
deleted file mode 100644
index f346bade..00000000
--- a/doc/src/images/neptune-dark-theme2.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/neptune-light-theme1.png b/doc/src/images/neptune-light-theme1.png
new file mode 100644
index 00000000..e91f0f2e
--- /dev/null
+++ b/doc/src/images/neptune-light-theme1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9a7018c627b871616851656de1b4a1a01d3fe6380ca455349c27ca049944a41c
+size 395181
diff --git a/doc/src/images/neptune-light-theme2.png b/doc/src/images/neptune-light-theme2.png
new file mode 100644
index 00000000..146b7249
--- /dev/null
+++ b/doc/src/images/neptune-light-theme2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9c0db6e8fd3366908012e35b575e43af50705f573606f6a7011cebbf8f514321
+size 264457
diff --git a/doc/src/images/parking-app.png b/doc/src/images/parking-app.png
index f2a75581..2b4edfc0 100644
--- a/doc/src/images/parking-app.png
+++ b/doc/src/images/parking-app.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:419df8cdc0340ee9cb8d2ce1bb217505ef24367019b7fceaafe1d9a810b47829
-size 418655
+oid sha256:6eb53b5538bfe90ab46be298718815e8a06e5212a2d3aedcc86e805c70736b42
+size 183463
diff --git a/doc/src/images/settings-app-accent-color.jpg b/doc/src/images/settings-app-accent-color.jpg
deleted file mode 100644
index 7662a11e..00000000
--- a/doc/src/images/settings-app-accent-color.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/settings-app-accent-color.png b/doc/src/images/settings-app-accent-color.png
new file mode 100644
index 00000000..c204fe97
--- /dev/null
+++ b/doc/src/images/settings-app-accent-color.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ef2d858a12e22fcb097f1510c994e48f170b649d1285c1c18f107ccbc2992e3b
+size 219479
diff --git a/doc/src/images/settings-app-languages.jpg b/doc/src/images/settings-app-languages.jpg
deleted file mode 100644
index 6b0e4397..00000000
--- a/doc/src/images/settings-app-languages.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/settings-app-languages.png b/doc/src/images/settings-app-languages.png
new file mode 100644
index 00000000..161df600
--- /dev/null
+++ b/doc/src/images/settings-app-languages.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3e75165fe368fa05783f1e5c10d71dca54340a6e1a28993d8f16f1c18b2c2e1b
+size 236820
diff --git a/doc/src/images/settings-app-themes.jpg b/doc/src/images/settings-app-themes.jpg
deleted file mode 100644
index 1d3da403..00000000
--- a/doc/src/images/settings-app-themes.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/settings-app-themes.png b/doc/src/images/settings-app-themes.png
new file mode 100644
index 00000000..7b997a99
--- /dev/null
+++ b/doc/src/images/settings-app-themes.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b40ba092728bef5bf630ce0375615f95322df7b499abf665807267877bd694fb
+size 209228
diff --git a/doc/src/images/settings-app-timezone.jpg b/doc/src/images/settings-app-timezone.jpg
deleted file mode 100644
index ba8829af..00000000
--- a/doc/src/images/settings-app-timezone.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/settings-app-timezone.png b/doc/src/images/settings-app-timezone.png
new file mode 100644
index 00000000..22a0b39d
--- /dev/null
+++ b/doc/src/images/settings-app-timezone.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:49e521f9f17e9f24b08285efda15b3b2f6e2b39b75513bd5d4f113cfd377fd91
+size 223609
diff --git a/doc/src/images/sheets-app-button.png b/doc/src/images/sheets-app-button.png
new file mode 100644
index 00000000..910b920e
--- /dev/null
+++ b/doc/src/images/sheets-app-button.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a950aa1496014f43a672e0b799dddfe8bd1f32901d5cd44fd9d04e7817970563
+size 91508
diff --git a/doc/src/images/sheets-app-listitem.png b/doc/src/images/sheets-app-listitem.png
new file mode 100644
index 00000000..1bb34684
--- /dev/null
+++ b/doc/src/images/sheets-app-listitem.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2c18a2a42ad22c84de3fd354ffe57a500d40768df850aa975582a995c47a5106
+size 211536
diff --git a/doc/src/images/sheets-app-notification.png b/doc/src/images/sheets-app-notification.png
new file mode 100644
index 00000000..43351b31
--- /dev/null
+++ b/doc/src/images/sheets-app-notification.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5b1948b5b5669b7661ecc48bdc30ef27f2438afca7390c202b762a580e4bd63a
+size 186230
diff --git a/doc/src/images/sheets-app-popup.jpg b/doc/src/images/sheets-app-popup.jpg
deleted file mode 100644
index c9ada237..00000000
--- a/doc/src/images/sheets-app-popup.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/sheets-app-popup.png b/doc/src/images/sheets-app-popup.png
new file mode 100644
index 00000000..562bc525
--- /dev/null
+++ b/doc/src/images/sheets-app-popup.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ad47de048152166deaef69094bf7c3db2bb15c7328f16c82a33bd72099e25162
+size 175677
diff --git a/doc/src/images/sheets-app-popupcolor.png b/doc/src/images/sheets-app-popupcolor.png
new file mode 100644
index 00000000..f8f0ab1f
--- /dev/null
+++ b/doc/src/images/sheets-app-popupcolor.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:71e103396b986d94cf0b6cb45dd9bb1646410d3d81e13d4ed7986175cc7709e1
+size 68107
diff --git a/doc/src/images/sheets-app-popups.png b/doc/src/images/sheets-app-popups.png
new file mode 100644
index 00000000..439bbd60
--- /dev/null
+++ b/doc/src/images/sheets-app-popups.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:954d1b3cc72a572a528a9f22ab8f6ebcbc13b48f9808d39b6dcde4cf5b96c5b8
+size 68107
diff --git a/doc/src/images/sheets-app-progress-bar.png b/doc/src/images/sheets-app-progress-bar.png
new file mode 100644
index 00000000..849c3ac3
--- /dev/null
+++ b/doc/src/images/sheets-app-progress-bar.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:df8bdcf9216f6d8ebe8eea0f97e6c4d11dfde02c4d34f6f075c9eeec84b746e1
+size 111834
diff --git a/doc/src/images/sheets-app-slider.png b/doc/src/images/sheets-app-slider.png
new file mode 100644
index 00000000..7aecd07e
--- /dev/null
+++ b/doc/src/images/sheets-app-slider.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b80931932784f5d0edb0bb35613f5bcce20e85227a29962143928a9ff5ab352b
+size 185176
diff --git a/doc/src/images/sheets-app-toolbutton.png b/doc/src/images/sheets-app-toolbutton.png
new file mode 100644
index 00000000..2a23fa43
--- /dev/null
+++ b/doc/src/images/sheets-app-toolbutton.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:514c1f3c730185078d74942e8db63f872f002d8e4fbf20de82739353424a4f81
+size 190975
diff --git a/doc/src/images/sheets-app.png b/doc/src/images/sheets-app.png
new file mode 100644
index 00000000..61a5ec1b
--- /dev/null
+++ b/doc/src/images/sheets-app.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a71fe0e638127199ec101c2b5db44ca843b2f410f7594f442afbe53ce7b28e05
+size 245297
diff --git a/doc/src/images/system-dialog-apps.jpg b/doc/src/images/system-dialog-apps.jpg
deleted file mode 100644
index 856b7b69..00000000
--- a/doc/src/images/system-dialog-apps.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/system-dialog-apps.png b/doc/src/images/system-dialog-apps.png
new file mode 100644
index 00000000..663a11fc
--- /dev/null
+++ b/doc/src/images/system-dialog-apps.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5f4b84eab4f240c0eed38db30ff37d910de95db137728423a52a2d69b1f1182d
+size 83811
diff --git a/doc/src/images/system-dialog-diagnostics.jpg b/doc/src/images/system-dialog-diagnostics.jpg
deleted file mode 100644
index 82b556b8..00000000
--- a/doc/src/images/system-dialog-diagnostics.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/system-dialog-diagnostics.png b/doc/src/images/system-dialog-diagnostics.png
new file mode 100644
index 00000000..7fb2d525
--- /dev/null
+++ b/doc/src/images/system-dialog-diagnostics.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:798427ec639839e4728a8ec188aacfe4b17ea84e1ed094defeb49e57f7551f95
+size 191032
diff --git a/doc/src/images/system-dialog-performance.jpg b/doc/src/images/system-dialog-performance.jpg
deleted file mode 100644
index 1e750ef4..00000000
--- a/doc/src/images/system-dialog-performance.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/system-dialog-performance.png b/doc/src/images/system-dialog-performance.png
new file mode 100644
index 00000000..61dcc5d1
--- /dev/null
+++ b/doc/src/images/system-dialog-performance.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:633ff6789316e97287526df81ecb9b911a730499cfc6cc7b9122d1c992080b93
+size 65907
diff --git a/doc/src/images/system-dialog-system.jpg b/doc/src/images/system-dialog-system.jpg
deleted file mode 100644
index 645ec25d..00000000
--- a/doc/src/images/system-dialog-system.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/system-dialog-system.png b/doc/src/images/system-dialog-system.png
new file mode 100644
index 00000000..aa200ecd
--- /dev/null
+++ b/doc/src/images/system-dialog-system.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:af48c26c2e7af3f85938dbb1e44beccdd1973e06ada4a2cd8d1d76ade4c50d74
+size 82863
diff --git a/doc/src/images/system-dialog-system2.jpg b/doc/src/images/system-dialog-system2.jpg
deleted file mode 100644
index 0ccac21c..00000000
--- a/doc/src/images/system-dialog-system2.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/system-dialog-system2.png b/doc/src/images/system-dialog-system2.png
new file mode 100644
index 00000000..fcaba8c0
--- /dev/null
+++ b/doc/src/images/system-dialog-system2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:032887933cc7e5012792eb0a08fd21ee8cb65e94a99082bd4945494196ed305b
+size 81604
diff --git a/doc/src/images/tools-column.jpg b/doc/src/images/tools-column.jpg
deleted file mode 100644
index 20b82053..00000000
--- a/doc/src/images/tools-column.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/src/images/tools-column.png b/doc/src/images/tools-column.png
new file mode 100644
index 00000000..b023ddd5
--- /dev/null
+++ b/doc/src/images/tools-column.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1612369e0cc979a10699caaca33f28673a6cbb714bcbeb5bbfb0157f40e04da9
+size 56865
diff --git a/doc/src/images/volume-control-mute.png b/doc/src/images/volume-control-mute.png
new file mode 100644
index 00000000..350b0fca
--- /dev/null
+++ b/doc/src/images/volume-control-mute.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1bcab42e01297749a09f43a78647d927ae824eed4726607b1b5bdc8202e4f288
+size 167491
diff --git a/doc/src/images/volume-control.png b/doc/src/images/volume-control.png
new file mode 100644
index 00000000..67542d29
--- /dev/null
+++ b/doc/src/images/volume-control.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2bd9183ce033f817db0e8dced4741bd21b108d63811db044b155156b0b82cb6d
+size 164585
diff --git a/doc/src/images/widget-bottom.png b/doc/src/images/widget-bottom.png
new file mode 100644
index 00000000..b5fa5e56
--- /dev/null
+++ b/doc/src/images/widget-bottom.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d30fa3a331de5f8cc36164d70732d918890c3dd8ce386a9210e75275d815d17a
+size 235774
diff --git a/doc/src/neptune3ui-3d-integration.qdoc b/doc/src/neptune3ui-3d-integration.qdoc
index c514da45..997f387b 100644
--- a/doc/src/neptune3ui-3d-integration.qdoc
+++ b/doc/src/neptune3ui-3d-integration.qdoc
@@ -137,7 +137,7 @@
\note You must have \l{Qt 3D Studio} installed and your Qt installation must support
OpenGL ES. For more details, see \l{Use the Qt 3D Studio Runtime}.
- \section1 Vehicle Integration with Qt 3D
+ \section1 Vehicle 3D Model Integration with Qt 3D
The diagram below shows the current structure of the Vehicle app sub-part built with Qt 3D:
@@ -158,7 +158,7 @@
animation is done with: transform the door to another origin, rotate it, then transform it back.
As a result, the door doesn't rotate around its own axis.
- \section1 Vehicle Integration with Qt 3D Studio
+ \section1 Vehicle 3D Model Integration with Qt 3D Studio
The integration scheme for the other sub-part, built with Qt 3D Studio, is similar to
\l{3D Gauges Integration with Qt 3D Studio}. The diagram below further illustrates this:
diff --git a/doc/src/neptune3ui-application-anatomy.qdoc b/doc/src/neptune3ui-application-anatomy.qdoc
index 6d9f8b66..e4d91005 100644
--- a/doc/src/neptune3ui-application-anatomy.qdoc
+++ b/doc/src/neptune3ui-application-anatomy.qdoc
@@ -38,7 +38,7 @@
\section1 Full-Screen
- \image center-stack-maximized-app.jpg
+ \image center-stack-maximized-app.png
When applications are in full-screen they typically have two main
content areas: top and bottom. The top area is for the most important
@@ -54,12 +54,12 @@
\section2 Breaking the rules
- Not every application should look the same. The best explaining cases are
- probably Navigation and Camera apps since they include complex graphics.
- Both applications need to look different from the default one,
+ Not every application should look the same. The best explaining case is
+ probably a Navigation app since it includes complex graphics.
+ The application needs to look different from the default one,
but should give the same impression.
- \image center-stack-nav.jpg
+ \image center-stack-nav.png
Some applications might not need to display the ToolBar, neither the top area.
Use a layout that fits the content of your application.
diff --git a/doc/src/neptune3ui-application-popups.qdoc b/doc/src/neptune3ui-application-popups.qdoc
index 66ec7d3d..f56e089d 100644
--- a/doc/src/neptune3ui-application-popups.qdoc
+++ b/doc/src/neptune3ui-application-popups.qdoc
@@ -53,11 +53,11 @@
\section3 Media Application
All available at the moment media sources.
- \image music-app-popup.jpg
+ \image music-app-popup.png
- \section4 Sheets Application
+ \section3 Sheets Application
Popup example in sheets application.
- \image sheets-app-popup.jpg
+ \image sheets-app-popups.png
*/
diff --git a/doc/src/neptune3ui-application-requests.qdoc b/doc/src/neptune3ui-application-requests.qdoc
index 381ec2c7..0c059766 100644
--- a/doc/src/neptune3ui-application-requests.qdoc
+++ b/doc/src/neptune3ui-application-requests.qdoc
@@ -30,6 +30,11 @@
\page neptune3ui-requests.html
\title Neptune 3 UI - App Requests
+ An application request is a collective term used in Neptune 3 UI to describe
+ an exchange of commands between apps. Application requests currently use two
+ features in \l{Qt Application Manager}: OpenDocument interface and
+ \l{Intents in Neptune 3 UI apps}.
+
An application request is used to send a request to an application to just open
or open in a certain state. That said, the action should be possible to be
performed from wherever in the system.
@@ -81,7 +86,7 @@
Connections {
target: ApplicationInterface
//handle here all specific app behavior
- onOpenDocument: {
+ function onOpenDocument: {
//process documentUrl "getmeto/Donald Weese Ct, Las Vegas"
}
}
@@ -114,21 +119,93 @@
\image application-requests-goback.jpg
- \section1 Current Use-Cases in Neptune 3 UI
-
- \section2 Media Application
- All media applications (Radio, Web Radio, Music are connected to each other using
- requests. To try it, navigating to either Music, Radio and/or WebRadio app and press
- "sources" in the toolbar menu on the right side. A popup will open with all available music
- sources. Choosing any of those will direct you to the respective music application.
-
- \section2 Vehicle Settings
- In the energy panel is a list with 'charging station' suggestions. If any of those is
- pressed, the maps application will directly open, loading the selected charging station's
- address and ready to navigate there.
-
- \section2 System Notifications
- A ctrl+n press simulates a "Battery Low" event by triggering a system notification containing
- an action button. If the action button is pressed, the map application will directly open,
- loading the suggested charging station's address and ready to navigate there.
+ \section1 Intents in Neptune 3 UI apps
+
+ \l{Qt Application Manager} intents enable an app to communicate with another app or with
+ System UI by sending a command and then waiting for a return value (information) in response.
+
+ The table below describes the set of intents (see \l{Qt Application Manager}{Intents System UI and Applications Example}
+ documentation) provided by apps, as well as a generalized description of how an app reacts on an
+ intent. For example, in the first row, the apps listed in "App" column react on activate-app intent
+ by opening or rising an app window.
+
+
+ \table
+ \header
+ \li Name
+ \li Functionality
+ \li App
+
+ \row
+ \li activate-app
+ \li opens or rises app window
+ \li \list
+ \li com.luxoft.vehicle
+ \li com.pelagicore.apps.settings
+ \li com.pelagicore.calendar
+ \li com.pelagicore.downloads
+ \li com.pelagicore.map
+ \li com.pelagicore.music
+ \li com.pelagicore.phone
+ \li com.pelagicore.tuner
+ \li com.luxoft.alexa
+ \endlist
+
+ \row
+ \li set-next-accent-color
+ \li switches to the next theme color
+ \li \list
+ \li com.pelagicore.apps.settings
+ \endlist
+ \row
+ \li show-destination
+ \li opens map search for text query (parameter: \c destination: text address query)
+ \li \list
+ \li com.pelagicore.map
+ \endlist
+ \row
+ \li music-command
+ \li switches music tracks (parameter: \c musiccommand: prev/next)
+ \li \list
+ \li com.pelagicore.music
+ \endlist
+
+ \row
+ \li call-support
+ \li initiates call to neptune support service (for more information
+ see \l{Chapter 2: Extend the Parking App and Integrate
+ with Intent and Notification} {Develop a Parking App})
+ \li \list
+ \li com.pelagicore.phone
+ \endlist
+ \row
+ \li trigger-voiceassistant
+ \li enables Alexa app to listen to commands
+ \li \list
+ \li com.luxoft.alexa
+ \endlist
+ \row
+ \li vehicle-control
+ \li operates vehicle's doors, trunk and sun roof. This intent requires 3 parameters:
+ \list
+ \li action: open/close
+ \li side: left/right
+ \li part: trunk/sunroof/door
+ \endlist
+ \li \list
+ \li com.luxoft.vehicle
+ \endlist
+ \endtable
+
+ \section2 Current Use-Cases in Neptune 3 UI
+
+ \section3 Media apps
+ All media apps (Radio, Web Radio, Music) are connected to each other using
+ requests. To try it, navigate to either Music, Radio or WebRadio app and press
+ "sources" in the toolbar menu on the left. A popup with all available music
+ sources will open. Tapping on any of those sources will direct you to the respective media app.
+
+ \section3 Vehicle Settings
+ There is a list with 'charging station' suggestions in the energy panel. If any of those is
+ pressed, the maps app will open and load the address of a selected charging station.
*/
diff --git a/doc/src/neptune3ui-companion-app.qdoc b/doc/src/neptune3ui-companion-app.qdoc
index 55c5256c..17051af5 100644
--- a/doc/src/neptune3ui-companion-app.qdoc
+++ b/doc/src/neptune3ui-companion-app.qdoc
@@ -43,6 +43,8 @@
implementing this kind of app, without requiring separate APIs and a dedicated architecture to
access vehicle function data.
+ \image companion-app.png
+
\section1 Using the app
The app is built and installed along with Neptune 3 UI. To start the app, run the
diff --git a/doc/src/neptune3ui-components.qdoc b/doc/src/neptune3ui-components.qdoc
index 61928e85..37397ea7 100644
--- a/doc/src/neptune3ui-components.qdoc
+++ b/doc/src/neptune3ui-components.qdoc
@@ -52,6 +52,7 @@
\li \l{ScalableBorderImage}
\li \l{ToolsColumn}
\li \l{Tracer}
+ \li \l{TouchPointsTracer}
\endlist
Neptune UI interfaces:
diff --git a/doc/src/neptune3ui-configure.qdoc b/doc/src/neptune3ui-configure.qdoc
index 30ed0f8c..ebdeda74 100644
--- a/doc/src/neptune3ui-configure.qdoc
+++ b/doc/src/neptune3ui-configure.qdoc
@@ -63,13 +63,14 @@
formatType: am-configuration
---
# basic AM functionality - the builtin apps are in 'apps'.
- # installations will go into the standard /tmp/am hierarchy
+ # installations will go into the standard QStandardPath AppLocalDataLocation
+ # (e.g. ~/.local/share/Luxoft Sweden AB/Neptune UI) /am hierarchy
applications:
- builtinAppsManifestDir: "${CONFIG_PWD}/apps"
- installedAppsManifestDir: "/tmp/neptune3-ui/manifests"
- appImageMountDir: "/tmp/neptune3-ui/image-mounts"
- database: "/tmp/neptune3-ui/apps.db"
+ builtinAppsManifestDir: "${CONFIG_PWD}/apps"
+ installedAppsManifestDir: "${stdpath:AppLocalDataLocation}/neptune3-ui/manifests"
+ installationDir: "${stdpath:AppLocalDataLocation}/neptune3-ui/apps"
+ documentDir: "${stdpath:AppLocalDataLocation}/neptune3-ui/docs"
# QML apps will be able to import from modules...
@@ -88,35 +89,34 @@
# ... as well as the SystemUI
ui:
- fullscreen: no
- style: "${CONFIG_PWD}/styles/neptune"
- iconThemeName: "neptune"
- iconThemeSearchPaths: [ "${CONFIG_PWD}/imports_shared/assets/icons" ]
- mainQml: "${CONFIG_PWD}/Main.qml"
- importPaths: [ "${CONFIG_PWD}/imports_shared", "${CONFIG_PWD}/imports_system", "${CONFIG_PWD}/sysui" ]
- windowIcon: "${CONFIG_PWD}/imports_shared/assets/icons/neptune/sysui/ic-menu-home.png"
+ fullscreen: no
+ style: "${CONFIG_PWD}/styles/neptune"
+ iconThemeName: "neptune"
+ iconThemeSearchPaths: [ "${CONFIG_PWD}/imports_shared/assets/icons" ]
+ mainQml: "${CONFIG_PWD}/Main.qml"
+ importPaths: [ "${CONFIG_PWD}/imports_shared", "${CONFIG_PWD}/imports_system", "${CONFIG_PWD}/sysui" ]
+ windowIcon: "${CONFIG_PWD}/imports_shared/assets/icons/neptune/sysui/ic-menu-home.png"
systemProperties:
public:
- showCluster: yes
- showHUD: yes
- devMode: yes
- hardwareVariant: 'high'
- #Qt Safe Renderer settings
- qsrEnabled: no
- qsrServerAddress: '127.0.0.1'
- qsrServerPort: '1111'
- showSystemAppsInLauncher: no
+ showCluster: yes
+ showHUD: yes
+ devMode: yes
+ hardwareVariant: 'high'
+ #Qt Safe Renderer settings
+ qsrEnabled: no
+ qsrServerAddress: '127.0.0.1'
+ qsrServerPort: '1111'
+ showSystemAppsInLauncher: no
private:
- appStoreServerUrl: 'http://chaos.pelagicore.net:9090'
- orientation: 'Portrait'
- adjustSizesForScreen: yes
+ appStoreServerUrl: 'http://demoappsdeploy.qt.io:8514'
+ orientation: 'Portrait'
+ adjustSizesForScreen: yes
# development setup: no security
-
flags:
- noSecurity: yes
- noUiWatchdog: yes
+ noSecurity: yes
+ noUiWatchdog: yes
\endcode
The YAML file contains options for system properties to show screens other than the Center
@@ -151,7 +151,7 @@
If you'd like to use the \l{Qt Automotive Suite Deployment Server}, set the \c appStoreServerUrl
parameter to contain your server's base URL together with its port. Currently, the default value
- is \c{http://chaos.pelagicore.net:9090}.
+ is \c{http://demoappsdeploy.qt.io:8514}.
All of these options are also configurable from the command line as a parameter to the \c appman
utility. For more information, see \l{Qt Application Manager Configuration}.
diff --git a/doc/src/neptune3ui-deployment-server.qdoc b/doc/src/neptune3ui-deployment-server.qdoc
new file mode 100644
index 00000000..22655b32
--- /dev/null
+++ b/doc/src/neptune3ui-deployment-server.qdoc
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 Luxoft Sweden AB
+** Copyright (C) 2018 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:FDL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page neptune3ui-deployment-server.html
+ \title Neptune 3 UI - Deployment Server
+ \brief Overview of how Neptune 3 UI works with \l{Qt Automotive Suite Deployment Server}
+
+ Neptune 3 UI works with Qt Automotive Suite Deployment Server, which is a
+ lightweight HTTP server that provides network feeds of application packages
+ that are available for installation by a Qt Application Manager instance,
+ running on a target device connected to a network. For more information,
+ see \l{Qt Automotive Suite Deployment Server} section.
+
+ A user interacts with \l{Qt Automotive Suite Deployment Server} using Downloads App,
+ described in \l{Neptune 3 UI Apps} section.
+
+ To change Deployment Server address please edit {appStoreServerUrl} property in Neptune 3 UI
+ configuration YAML file. See \l{Neptune 3 UI - Configure}.
+
+ Deployment Server YAML tags (see \l{Qt Automotive Suite Deployment Server}{Assumptions})
+ are used for packages with specific target architecture for C++ plugins.
+
+*/
diff --git a/doc/src/neptune3ui-install.qdoc b/doc/src/neptune3ui-install.qdoc
index bae78a20..515bc74d 100644
--- a/doc/src/neptune3ui-install.qdoc
+++ b/doc/src/neptune3ui-install.qdoc
@@ -109,8 +109,8 @@
\section2 Dependencies
\list
- \li \l{Qt Application Manager} 5.13
- \li \l{Qt IVI} 5.13
+ \li \l{Qt Application Manager} 5.15
+ \li \l{Qt IVI} 5.15
\li \l{Qt Safe Renderer} 1.1 (optional)
\li \l{Qt 3D Studio} (optional)
\endlist
@@ -119,9 +119,9 @@
\list 1
\li Clone the repositories mentioned in \l{Install Qt Automotive Suite}.
- \li Build \l{Qt Application Manager} against Qt 5.13. For more detailed build
+ \li Build \l{Qt Application Manager} against Qt 5.15. For more detailed build
instructions, see \l{Qt Applicaton Manager Installation}.
- \li Build \l{Qt IVI} against Qt 5.13. For more detailed build instructions, see
+ \li Build \l{Qt IVI} against Qt 5.15. For more detailed build instructions, see
\l[QtIvi]{Installation}.
\li Run the following command in a terminal, to build Neptune 3 UI:
\badcode
diff --git a/doc/src/neptune3ui-middleware.qdoc b/doc/src/neptune3ui-middleware.qdoc
index 966f837e..9f07afd3 100644
--- a/doc/src/neptune3ui-middleware.qdoc
+++ b/doc/src/neptune3ui-middleware.qdoc
@@ -130,6 +130,7 @@
\l {Generate QtRemoteObjects based backends with the Qt IVI Generator} for a more
detailed explanation and a walkthrough on generating middleware services.
\li See \l{Qt IVI Simulation System} for more info about simulations.
+ \li See \l{Develop a Parking App}
\endlist
*/
diff --git a/doc/src/neptune3ui-overview.qdoc b/doc/src/neptune3ui-overview.qdoc
index ffad6b96..1045bc03 100644
--- a/doc/src/neptune3ui-overview.qdoc
+++ b/doc/src/neptune3ui-overview.qdoc
@@ -75,8 +75,8 @@
\li Description
\row
\li \l{Neptune 3 UI - System UI}{System UI} (\c sysui)
- \li Displays system information and provides a way to discover as well
- as launch apps. Examples such as apps are the climate panel,
+ \li Displays system information and provides a way to discover and
+ launch apps. Examples of apps are the climate panel,
notification center, app launcher, status bar, and so on.
\row
\li Apps (\c apps)
@@ -122,7 +122,7 @@
\li Calendar App (\c calendarapp)
\li An organizer app with some dummy data showing a set of
appointments, the current year calendar and dummy weather forecast
- with mockup data. Currently, there is no real backend implemented.
+ with mockup data. Currently, there is no real backend implemented
for this app.
\row
\li Phone App (\c phoneapp)
@@ -140,7 +140,7 @@
these external apps using the Downloads app.
\row
\li \l{Neptune 3 UI - General Settings App}{General Settings}
- \c settingsapp)
+ (\c settingsapp)
\li General Settings provides a set of common UI settings, such as
language settings, theme settings, date and time settings, as well
as color settings.
@@ -155,22 +155,32 @@
\li \l{Center Console Display}
\li \l{App Launcher}
\li \l{App Widget}
+ \li \l{Volume Control}
+ \li \l{Sheets App}
\li \l{Climate Bar}
\li \l{Notification Center}
\endlist
\section2 Instrument Cluster
- \image instrument-cluster.jpg
+ \image instrument-cluster.png
The Instrument Cluster displays driving related information such as speed,
cruise control parameters, gear and energy use (for an electric car). Users
can also have information from the selected app windows, such as Music or
Maps, ordered in views which they can navigate between. To switch
- between the app windows available, the user can use Neptune 3 UI's remote
- settings server or press \uicontrol{Ctrl+C} in a physical keyboard.
+ between the available app windows, the user can use \l{Neptune 3 UI Companion App}
+ or press \uicontrol{Ctrl+C} on a physical keyboard.
+ The tell-tales (for example, the icons of headlights, engine and oil check, or other)
+ in the upper part of the instrument cluster (see image below) are not shown by default
+ on start-up. Instead, they are shown by a simulation after a certain time and can
+ be controlled only by using the \l{Neptune 3 UI Companion App}. After UI-startup,
+ the default backend simulation is started. More information about the backend
+ simulation can be found in section \l{Neptune 3 UI - Middleware}.
- \image instrument-cluster-nav.jpg
+ \image instrument-cluster-tt.png
+
+ \image instrument-cluster-nav.png
The size and position of gauges and other driving related information are
flexible to make space for views, like Maps that can take up more space
@@ -191,17 +201,59 @@
with opengl ES 3.0 requirements set by \c{.yaml} config file.
For more details, see \l{Qt Application Manager}.
+ \section3 Cluster App
+
+ \image cluster-app-main.png
+
+ A Cluster App has its own life cycle and can run independently from Neptune
+ 3 UI, allowing user to see the whole scope of necessary information, like maps, music,
+ and vehicle view on the \l{Instrument Cluster} screen.
+
+ As a stand-alone app, Cluster App can be run on a separate board or in a dedicated hypervisor
+ domain. It connects to the same backends, as Neptune 3 UI, using a network connection.
+
+ Cluster App shares the design and generic components of Neptune 3 UI. For example, if the user
+ has changed the theme in Neptune 3 UI, the same one will be applied to Cluster App.
+
+ There are three types of views available for user to switch between:
+
+ \list
+ \li \l{Vehicle View}
+ \li \l{Music View}
+ \li \l{Maps View}
+ \endlist
+
+ \section4 Vehicle View
+
+ This view reflects the same state, which is shown (or would be shown if the cluster app is active)
+ in the cluster app displayed on the cluster window.
+
+ \image cluster-app-car.png
+
+ \section4 Music View
+
+ Music view is almost the same as the part of the music app (which is displayed in cluster window) except
+ for the track covers, that are not displayed.
+
+ \image cluster-app-music.png
+
+ \section4 Maps View
+
+ Maps View displays the map in the same way, as it's displayed in Neptune 3 UI \l{Maps App},
+ allowing user to see vehicle's location, destination and route right on the \l{Instrument Cluster}.
+
+ \image cluster-app-map.png
+
+ \note The Cluster App is a plain Qt/Qml app, it is not based on \l{Qt Application Manager}.
\section2 Center Console Display
- The Center Console display shows the multi-process capabilities; the fact
- that we can run several apps simultaneously, with quick response and
- smooth transitions. Even if, technically, we have different apps that run on
- separate processes, the border between these apps is faded out. In turn, the
- border between these apps and the System UI is also faded out, giving the
- user an experience that this is one unified system.
+ The Center Console display demonstrates the multi-process capabilities. This means,
+ that several apps can be run simultaneously, using separate processes, providing
+ quick response and smooth transitions, and giving the user an experience of operating
+ one unified system.
- \image center-stack.jpg
+ \image center-stack.png
In addition to traditional apps, like Music, Phone, and Maps, the
Center Console display also contains climate settings, system notifications,
@@ -209,12 +261,12 @@
Some apps, such as Music, can be displayed in fullscreen or as widgets.
Widgets are apps that run in a smaller window and adapt their content to fit
- into a widget window. These widgets are used in the customizable home screen.
+ into a widget window. These \l{App Widget}s are used in the customizable home screen.
When an app is maximized, it takes over the whole Center Console and shows
the app's full content, as illustrated below.
- \image center-stack-maximized-app.jpg
+ \image center-stack-maximized-app.png
\section2 App Launcher
@@ -223,12 +275,25 @@
\image grid-icon.jpg
- Users can choose which app to maximize by tapping on the app icon. Users
- can also define four top apps to show without expanding the launcher by
- pressing and holding the selected app, and then dragging it to the desired
- position as illustrated in the following image:
+ Users can choose which app to maximize by tapping on the app icon.
+ To go back to the home screen after maximizing the desired app,
+ user can tap on "Home" button as illustrated below:
- \image center-stack-app-launcher.jpg
+ \image center-stack-maximized-app-home.png
+
+ Users can also define four top apps to show without expanding
+ the launcher by pressing and holding the selected app, and then
+ dragging it to the desired position as illustrated in the following image:
+
+ \image center-stack-app-launcher.png
+
+ The App Launcher displays pre-installed apps, such as Music, Maps, or Phone,
+ that are already there when Neptune 3 UI is started up for the first time,
+ but the user can also download and install other apps by tapping on Downloads App
+ as illustrated below:
+
+ \image app-launcher-downloads.png
+ \image app-launcher-downloads2.png
\section2 App Widget
@@ -236,28 +301,103 @@
choose which app to show on the home screen as a widget, by tapping on the
Add Widget icon below the lowest widget and choose the desired app.
- \image center-stack-add-widget.jpg
+ \image center-stack-add-widget.png
Only apps that have a widget option are listed there. The user can also remove
a widget from the home screen by tapping on the X icon at the widget's
bottom left corner.
+ After an app is started and shows up full-screen, the bottom widget still remains
+ visible. This allows a quick access to the functionality provided by the widget even
+ if an app is in foreground. It is possible to swipe the widget to the side:
+
+ \image widget-bottom.png
+
+ \note Users can remove any widget from the Home screen, except the bottom one.
\note Removing an app widget does not mean that the app is terminated. The
- app might still be running in the background. See
- \l{Neptune 3 UI System Dialog} for more information about terminating an
- app.
+ app is still running in the background. See \l{Neptune 3 UI System Dialog}
+ for more information about terminating an app.
- \section2 Climate Bar
+ Users can maximize the desired app by tapping on "Maximize" icon in the upper right corner of a widget:
+
+ \image center-stack-max-app-from-widget.png
+
+ The widgets can also be resized by tapping and holding a line between two consequent widgets:
+
+ \image center-stack-resize-widget.png
+
+ \section2 Volume Control
+
+ To modify the volume, users can simply tap on a speaker icon in the bottom
+ left corner of the display and modify the volume using a stepper slider, as illustrated below:
+
+ \image volume-control.png
+
+ Users can also mute the sounds by tapping on the corresponding icon, as illustrated below:
+
+ \image volume-control-mute.png
+
+ \note The volume can be changed in any menu, except for \l{App Launcher}
+
+ \section2 Sheets App
+
+ \image sheets-app.png
+
+ The Sheets App provides information about UI controls used in the Neptune 3 UI and can be
+ used as a UI component gallery for development purposes. All available UI controls are listed
+ in the following categories:
- \image center-stack-climate.jpg
+ \list
+ \li Button
+ \li ListItem
+ \li Notifications
+ \li Popups
+ \li ProgressBar
+ \li Slider
+ \li ToolButton
+
+ \endlist
+
+ \section3 Button
+
+ \image sheets-app-button.png
+
+ \section3 ListItem
+
+ \image sheets-app-listitem.png
+
+ \section3 Notifications
+
+ \image sheets-app-notification.png
+
+ \section3 Popups
+
+ \image sheets-app-popup.png
+ \image sheets-app-popupcolor.png
+
+ \section3 ProgressBar
+
+ \image sheets-app-progress-bar.png
+
+ \section3 Slider
+
+ \image sheets-app-slider.png
+
+ \section3 ToolButton
+
+ \image sheets-app-toolbutton.png
+
+ \section2 Climate Bar
The Climate Bar is located at the bottom of the \l{Center Console Display}.
Tapping on it displays a climate panel with some simulation data interface
to \l{Qt IVI} as shown in the following image:
+ \image center-stack-climate.png
+
\section2 Notification Center
- \image center-stack-notification-center.jpg
+ \image center-stack-notification-center.png
The Notification Center stores notifications that are triggered in
Neptune 3 UI. When a notification is triggered, first, a notification toast
@@ -265,6 +405,19 @@
can remove individual notifications in the Notification Center, or clear the
Notification Center completely.
+ \section2 Starting the Neptune 3 UI on a desktop
+
+ Neptune 3 UI can also be started up on a desktop. The following picture
+ demonstrates the three windows (\l{Instrument Cluster}, \l{Center Console Display}
+ and HUD), that are started up on a desktop PC:
+
+ \image desktop_startup.png
+
+ The users can resize desktop windows, and the content will be scaled according
+ to the standard aspect ratio.
+ Moreover, the users can close the windows separately in the desktop mode,
+ and Neptune 3 UI shuts down only after the last window is closed.
+
\section2 Keyboard Shortcuts
The following keyboard shortcuts are supported:
@@ -292,6 +445,33 @@
\row
\li Ctrl+Shift+R
\li Rotate the content in the Instrument Cluster.
+ \row
+ \li Ctrl+V
+ \li Activate or stop Voice Assistant.
\endtable
+ \section2 Gamepad Shortcuts
+
+ Neptune 3 UI can be controlled by some buttons from Gamepad QML Type. If you'd
+ like to get more information on Gamepad QML Type, go to the corresponding section
+ of Qt Documentation.
+
+ The following buttons are currently used:
+
+ \table
+ \header
+ \li Shortcut
+ \li Description
+ \row
+ \li Button B
+ \li Moves the user to the next window in cluster
+ \row
+ \li Button R1
+ \li Switch to the next music track
+ \row
+ \li Button L1
+ \li Switch to the previous music track
+ \endtable
+
+
*/
diff --git a/doc/src/neptune3ui-qt-safe-renderer-integration.qdoc b/doc/src/neptune3ui-qt-safe-renderer-integration.qdoc
index 70fc55b1..2e1b4b89 100644
--- a/doc/src/neptune3ui-qt-safe-renderer-integration.qdoc
+++ b/doc/src/neptune3ui-qt-safe-renderer-integration.qdoc
@@ -222,16 +222,22 @@
\image qt-safe-renderer-overlay.png
- To run Qt Safe Renderer on desktop, first start \c neptune3-ui and then run
- \c neptune3-ui-qsr-cluster app. The transparent Safe UI window is shown with the same telltales,
- text values for speed and power as Neptune 3 UI cluster shows.On desktop, it's possible to
- place a Qt Safe Renderer window directly over Neptune 3 UI's cluster window to demonstrate that
- telltales are positioned and scaled the same on both Safe and Non-Safe parts. Cluster window
- positions are sent from the non-safe partition to the Safe part if Qt Safe Renderer support is
- enabled. For \c neptune3-ui-qsr-cluster overlaying of Neptune's 3 UI Cluster window is enabled
- by default and can be switched off by modifying the Boolean key in the settings file based on
- \l{QSettings' Platform-Specific Notes}{QSettings} with "Luxoft Sweden AB" as the company name and
- "QSRCluster" as the application name:
+ To run Qt Safe Renderer on desktop, first start \l {Neptune 3 UI - Middleware}{middleware}
+ services: \c remotesettings-server and \c drivedata-simulation-server.
+
+ \note If these services are not started before Neptune 3 UI app, they will be stopped after
+ the app has been closed.
+
+ Then start \c neptune3-ui and afterwards \c neptune3-ui-qsr-cluster app. The transparent Safe UI
+ window is shown with the same telltales and text values for speed and power as in Neptune 3 UI
+ cluster. It's possible to place a Qt Safe Renderer window directly over Neptune 3 UI's
+ cluster window in the desktop version to demonstrate that telltales have the same position and
+ scale on both Safe and Non-Safe parts. If Qt Safe Renderer support is enabled, cluster window
+ positions are sent from the non-safe partition to the safe part. For \c neptune3-ui-qsr-cluster
+ Neptune 3 UI Cluster window overlay is enabled by default and can be switched off by
+ modifying the Boolean key in the settings file based on
+ \l{QSettings' Platform-Specific Notes}{QSettings} with "Luxoft Sweden AB" as the company name
+ and "QSRCluster" as the application name:
\badcode
[gui]
diff --git a/doc/src/neptune3ui-service-settings.qdoc b/doc/src/neptune3ui-service-settings.qdoc
new file mode 100644
index 00000000..127585dd
--- /dev/null
+++ b/doc/src/neptune3ui-service-settings.qdoc
@@ -0,0 +1,139 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the documentation of the Neptune module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+
+ \page neptune3ui-systemd-service-settings.html
+ \title Neptune 3 UI - Systemd Service Settings
+ \brief Description of settings used to start Neptune 3 UI as a systemd service.
+
+ There are three sections in Neptune 3 UI service file:
+
+ \list
+ \li [Unit]
+ \li [Service]
+ \li [Install]
+ \endlist
+
+ \section1 [Unit] Section
+
+ This section describes the service itself, including dependencies and/or conflicts,
+ as well as loading order.
+
+ The section consists of a number of variables, as follows:
+
+ \table
+ \header
+ \li Variable
+ \li Description
+
+ \row
+ \li Description=Neptune3-UI
+ \li Service description displayed by system tools
+
+ \row
+ \li After=dbus.service dbus-session@root.service systemd-user-sessions.service ivi-services.target
+ \li Loading order (After=dbus.service). It means that Neptune 3 UI systemd Service will be loaded
+ after dbus.service. Then goes dbus user session (there are two sessions - user and system session), and
+ a number of services providing data for Neptune 3 UI (ivi-services.target).
+
+ \row
+ \li Wants=ivi-services.target dbus-session@root.service
+ \li Tells that ivi-services.target and dbus user session are in direct dependence.
+
+ \row
+ \li Conflicts=neptune-qsr.service
+ Before=neptune-qsr.service
+ OnFailure=neptune-qsr.service
+ \li These variables describe the startup behavior: first, neptune3-ui starts, then it conflicts with
+ QSR Content app. Also, those variables mean that QSR content app should start, if neptune3-ui
+ crashes. It could be just {conflicts}, but in this case systemd does not wait for
+ complete shut down of Neptune 3 UI and shuts down both of the services.
+ \endtable
+
+ \section1 [Service] Section
+
+ This section describes, how the service starts up and what parameters are used for that.
+
+ \table
+ \header
+ \li Variable
+ \li Description
+
+ \row
+ \li User=root
+ \li Start as a root user (administrator in linux/unix).
+
+ \row
+ \li ExecStart=/opt/neptune3/neptune3-ui -r --dbus session -c am-config-neptune.yaml
+ \li Sevice startup command.
+
+ \row
+ \li WorkingDirectory=/opt/neptune3
+ \li Catalog, to which systemd switches to before service is started.
+
+ \row
+ \li EnvironmentFile=/etc/default/qt
+ \li Environment variables are loaded from the file in format \c Variable=value
+
+ \row
+ \li Environment=AM_STARTUP_TIMER=1
+ \li When set to "1", this variable enables measuring of time needed to
+ start up the Neptune 3 UI. In this case, the measured time value is displayed
+ in the system menu.
+ When set to "0", the measuring of time needed to start up the Neptune 3 UI
+ is turned off, and is not displayed in the system menu.
+
+ \row
+ \li Environment=QT_QPA_EGLFS_HIDECURSOR=1
+ \li This variable manages visibility of mouse cursor: when set to "1" mouse cursor
+ is hidden, when set to "0" it is visible.
+
+ \endtable
+
+ \section1 [Install] Section
+
+ In this section it's determined, how the service file will be installed.
+
+ \table
+ \header
+ \li Variable
+ \li Description
+
+ \row
+ \li WantedBy=multi-user.target
+ \li In this use case the service file is a part of multi-user system target. That's why it
+ will be installed as one of dependencies.
+
+ \endtable
+
+ \note In any case of changes in .service file, it's necessary to run \c {systemctl daemon-reload},
+ otherwise \c systemd will not reload the file changes and will use the old file.
+
+
+
+ */
diff --git a/doc/src/neptune3ui-settings-application.qdoc b/doc/src/neptune3ui-settings-application.qdoc
index ef544559..cb32efdd 100644
--- a/doc/src/neptune3ui-settings-application.qdoc
+++ b/doc/src/neptune3ui-settings-application.qdoc
@@ -36,7 +36,7 @@
\section1 Languages Settings
- \image settings-app-languages.jpg
+ \image settings-app-languages.png
Settings application contains a language settings menu that allows the user to
set the global language used in Neptune 3 UI.
@@ -50,35 +50,40 @@
\li Japanese Language
\li Chinese Language
\li Korean Language
+ \li Arabic
\endlist
+ Users don't need to restart the UI to make the UI layout change
+ from "left-to-right" to "right-to-left" and vice versa
+ when switching between Arabic and other supported languages.
+
\section1 Date and Time Settings
- \image settings-app-timezone.jpg
+ \image settings-app-timezone.png
Settings application contains a date and time settings menu that allows the user to
set the time format and time zone.
\section1 Themes Settings
- \image settings-app-themes.jpg
+ \image settings-app-themes.png
- Neptune 3 UI supports two type of themes, dark theme and light theme. By default,
- light theme is used. The user can change the UI theme through the Settings application
- to switch between dark and light theme.
+ Neptune 3 UI supports two type of themes - dark and light. By default,
+ dark theme is used. The user can switch between dark and light themes
+ in the Settings App.
- The images below show how the dark theme looks like:
+ The images below show how the light theme looks like:
- \image neptune-dark-theme1.jpg
+ \image neptune-light-theme1.png
- \image neptune-dark-theme2.jpg
+ \image neptune-light-theme2.png
\section1 Accent Color Settings
- \image settings-app-accent-color.jpg
-
Neptune 3 UI provides eight options of color to be used as the accent color. The
- default color is orange.
+ default color is green, as shown on the image below:
+
+ \image settings-app-accent-color.png
The following images show how it looks when the accent color is being changed.
diff --git a/doc/src/neptune3ui-system-dialog.qdoc b/doc/src/neptune3ui-system-dialog.qdoc
index 0730a2c5..2a5ce418 100644
--- a/doc/src/neptune3ui-system-dialog.qdoc
+++ b/doc/src/neptune3ui-system-dialog.qdoc
@@ -42,7 +42,9 @@
\li Startup Timings: provides the time spent from booting until the process starting
point of the System UI and from the starting point of the System UI until the first
frame to be drawn
- \li CPU consumptions and memory consumptions
+ \li CPU consumptions and memory consumptions (CPU, GPU and Memory consumption values
+ should be taken as absolute values, because visualization of these values takes performance
+ resources as well)
\li Network (Internet Connection) Status
\li Connected Network Devices with all their address information
\li Version: shows which Neptune 3 UI, Application Manager and Qt IVI versions are being
@@ -53,9 +55,9 @@
On top of the list, there is also a switch button that is used to show the system monitor
overlay on top of the UI to show the performance monitor numbers while operating the UI.
- \image system-dialog-system.jpg
+ \image system-dialog-system.png
- \image system-dialog-system2.jpg
+ \image system-dialog-system2.png
\section1 List of Apps
@@ -94,7 +96,12 @@
widgets, if the app is stopped or the widget is closed, and \c Autostart is disabled, then the
app doesn't start and the widget isn't shown on the Home screen upon system restart.
- \image system-dialog-apps.jpg
+ You can remove the app if it is not built-in (installed with
+ \l{Qt Creator Plugin for Qt Application Manager}, \l{Controller}{appman-controller} or from
+ \l{Neptune 3 UI Apps}{Downloads app}). To remove the installed app, tap on the recyle bin icon
+ near the app id.
+
+ \image system-dialog-apps.png
\section1 Performance Tab
@@ -102,11 +109,11 @@
overlay of the \l{center console display} and the \l{instrument cluster}. It forces the System UI
to constantly re-draw itself to get the current GPU/CPU consumptions.
- \image system-dialog-performance.jpg
+ \image system-dialog-performance.png
\section1 Diagnostics Tab
- The last tab of the system dialog shows the output of the QtDiag diagnostic tool.
+ The last tab of the system dialog shows the output of the qtdiag diagnostic tool.
- \image system-dialog-diagnostics.jpg
+ \image system-dialog-diagnostics.png
*/
diff --git a/doc/src/neptune3ui-testing-squish.qdoc b/doc/src/neptune3ui-testing-squish.qdoc
index 2fbbe163..6d864c30 100644
--- a/doc/src/neptune3ui-testing-squish.qdoc
+++ b/doc/src/neptune3ui-testing-squish.qdoc
@@ -130,12 +130,12 @@ attachableAUT/app_vehicle = "localhost:7732"
\li remotesettings-server
\endlist
- Consequently, for Neptune 3 UI you have to force Squish to ignore these processes to run the
+ Consequently, for Neptune 3 UI you need to force Squish to ignore these processes to run the
tests. Otherwise these tests might not succeed from the beginning - for example because of a
stopped D-Bus session.
To \l{https://doc.froglogic.com/squish/latest/rg-ini-files.html#ignoredauts.txt}{ignore these processes}
- you have to add or edit the \c ignoredauts.txt file in your Squish installation directory.
+ you need to add or edit the \c ignoredauts.txt file in your Squish installation directory.
For macOS and other Unix-like Operating Systems, the file is in \c{SQUISHDIR/etc/}.
For Linux, make the following change:
diff --git a/doc/src/neptune3ui-topics.qdocinc b/doc/src/neptune3ui-topics.qdocinc
index 1f6f7186..2a36b74b 100644
--- a/doc/src/neptune3ui-topics.qdocinc
+++ b/doc/src/neptune3ui-topics.qdocinc
@@ -45,6 +45,7 @@
\li \l {Neptune 3 UI - Companion App}{Companion App}
\li \l {Neptune 3 UI - Configure Screens on Embedded Linux}{Configure Screens on Embedded Linux}
\li \l {Neptune 3 UI - Squish Automated UI Testing}{Squish Automated UI Testing}
+ \li \l {Neptune 3 UI - Voice Assistant}{Voice Assistant}
\endlist
\section2 Application Insights
@@ -65,7 +66,9 @@
\list
\li \l {Neptune 3 UI - Components and Interfaces}{Components and Interfaces}
+ \li \l {Neptune 3 UI - Systemd Service Settings}{Systemd Service Settings}
\li \l {Develop a Parking App}
+ \li \l {Neptune 3 UI - Deployment Server}{Deployment Server}
\endlist
//! [content]
*/
diff --git a/doc/src/neptune3ui-troubleshoot.qdoc b/doc/src/neptune3ui-troubleshoot.qdoc
index 683508ab..615cca3f 100644
--- a/doc/src/neptune3ui-troubleshoot.qdoc
+++ b/doc/src/neptune3ui-troubleshoot.qdoc
@@ -33,11 +33,11 @@
can be configured via Qt's \l{https://doc.qt.io/qt-5/qloggingcategory.html}{Logging Category System}.
In addition to controlling the categories using the \c QT_LOGGING_RULES environment variable
and the global \c qtlogging.ini, the QtApplicationManager, which is Neptune 3 UI's base, also
- allows you to define these categories as part of the \c am-config.yaml file.
+ allows you to define these categories as a part of the \c am-config.yaml file.
\note On embedded systems, Neptune 3 UI is started with systemd. Here, you can control the
categories using environment variables or custom command-line arguments, via the
- \c neptune.service file.
+ \c neptune.service file. For more information, see \l{Neptune 3 UI systemd Service Settings}.
\section1 Recreate the Application Database
diff --git a/doc/src/neptune3ui-voice-assistant.qdoc b/doc/src/neptune3ui-voice-assistant.qdoc
new file mode 100644
index 00000000..c58f73b2
--- /dev/null
+++ b/doc/src/neptune3ui-voice-assistant.qdoc
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:FDL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+
+ \page neptune3ui-voice-assistant.html
+ \title Neptune 3 UI - Voice Assistant
+ \brief Neptune 3 UI Voice Assistant description
+
+ The Neptune 3 UI provides optional support for a voice assistant,
+ that allows user to operate UI features by voice commands.
+ Amazon's Alexa (c) is currently used as a voice assistant.
+
+ The voice assistant app can be installed via the Downloads App.
+ Please note, that the app might not be available for all platforms and
+ CPU architectures.
+
+ A dedicated button for the activation of Alexa is available in the
+ Neptune 3 UI status bar after a successful installation:
+
+ \image alexa-status-bar-button.png
+
+ In order to appear in Neptune 3 UI status bar, the window inside the voice
+ assistant app should have window property "windowType", that is
+ equal to "statusbar":
+ \code
+ setWindowProperty("windowType", "statusbar")
+ \endcode
+ It is possible to get available space inside status bar by using:
+ \code
+ Config.statusBarHeight
+ \endcode
+ The Alexa app sources can be downloaded from Qt Voice Assistant repository at:
+ \l {https://code.qt.io/cgit/qt/qtvoiceassistant.git/}{Qt Voice Assistant}
+
+
+*/
diff --git a/examples/neptune3ui/parking-app-tutorial/chapter1-basics/Main.qml b/examples/neptune3ui/parking-app-tutorial/chapter1-basics/Main.qml
index 1bf57201..9cfe48a2 100644
--- a/examples/neptune3ui/parking-app-tutorial/chapter1-basics/Main.qml
+++ b/examples/neptune3ui/parking-app-tutorial/chapter1-basics/Main.qml
@@ -83,7 +83,7 @@ ApplicationCCWindow {
Label {
- text: "No active parking tickets"
+ text: qsTr("No active parking tickets")
anchors.centerIn: parent
font.weight: Font.Light
opacity: !root.parkingStarted ? 1.0 : 0.0
@@ -111,7 +111,7 @@ ApplicationCCWindow {
Behavior on opacity { DefaultNumberAnimation {} }
Label {
- text: "Zone \nParking Olympia"
+ text: qsTr("Zone \nParking Olympia")
font.weight: Font.Light
color: "black"
}
@@ -160,7 +160,7 @@ ApplicationCCWindow {
}
Label {
- text: "2h, 14 minutes"
+ text: qsTr("2h, 14 minutes")
font.weight: Font.Light
opacity: Style.opacityHigh
color: "black"
@@ -195,7 +195,7 @@ ApplicationCCWindow {
spacing: Sizes.dp(50)
Label {
- text: "Zone"
+ text: qsTr("Zone")
font.weight: Font.Light
opacity: Style.opacityMedium
font.pixelSize: Sizes.fontSizeL
@@ -206,21 +206,21 @@ ApplicationCCWindow {
Column {
Label {
- text: "Every day 12 - 22"
+ text: qsTr("Every day 12 - 22")
font.weight: Font.Light
font.pixelSize: Sizes.fontSizeS
opacity: Style.opacityMedium
}
Label {
- text: "Other times"
+ text: qsTr("Other times")
font.weight: Font.Light
font.pixelSize: Sizes.fontSizeS
opacity: Style.opacityMedium
}
Label {
- text: "Service fee"
+ text: qsTr("Service fee")
font.weight: Font.Light
font.pixelSize: Sizes.fontSizeS
opacity: Style.opacityMedium
@@ -229,14 +229,14 @@ ApplicationCCWindow {
Column {
Label {
- text: "1.5 $ / started hour"
+ text: qsTr("1.5 $ / started hour")
font.weight: Font.Light
font.pixelSize: Sizes.fontSizeS
opacity: Style.opacityMedium
}
Label {
- text: "1 $ / started hour"
+ text: qsTr("1 $ / started hour")
font.weight: Font.Light
font.pixelSize: Sizes.fontSizeS
opacity: Style.opacityMedium
@@ -257,7 +257,7 @@ ApplicationCCWindow {
Label {
anchors.right: parent.right
- text: "1275, Parking Olympia"
+ text: qsTr("1275, Parking Olympia")
font.weight: Font.Light
opacity: Style.opacityMedium
}
@@ -269,7 +269,7 @@ ApplicationCCWindow {
font.pixelSize: Sizes.fontSizeM
checkable: true
checked: root.parkingStarted
- text: !root.parkingStarted ? "Start" : "End (2.29 $)"
+ text: !root.parkingStarted ? qsTr("Start") : qsTr("End (2.29 $)")
background: Rectangle {
color: {
diff --git a/examples/neptune3ui/parking-app-tutorial/chapter1-basics/chapter1-basics.pro b/examples/neptune3ui/parking-app-tutorial/chapter1-basics/chapter1-basics.pro
index e570c29b..64e40e2d 100644
--- a/examples/neptune3ui/parking-app-tutorial/chapter1-basics/chapter1-basics.pro
+++ b/examples/neptune3ui/parking-app-tutorial/chapter1-basics/chapter1-basics.pro
@@ -5,10 +5,10 @@ FILES += info.yaml \
Main.qml
assets.files += assets/*
-assets.path = /apps/chapter1-basics/assets
+assets.path = $$[QT_INSTALL_EXAMPLES]/neptune3-ui/chapter1-basics/assets
app.files = $$FILES
-app.path = /apps/chapter1-basics
+app.path = $$[QT_INSTALL_EXAMPLES]/neptune3-ui/chapter1-basics
INSTALLS += app assets
diff --git a/examples/neptune3ui/parking-app-tutorial/chapter2-extend/Main.qml b/examples/neptune3ui/parking-app-tutorial/chapter2-extend/Main.qml
index e2c815b4..51f0de3d 100644
--- a/examples/neptune3ui/parking-app-tutorial/chapter2-extend/Main.qml
+++ b/examples/neptune3ui/parking-app-tutorial/chapter2-extend/Main.qml
@@ -79,7 +79,7 @@ ApplicationCCWindow {
source: Style.image("app-fullscreen-top-bg", Style.theme)
Label {
- text: "No active parking tickets"
+ text: qsTr("No active parking tickets")
anchors.centerIn: parent
font.weight: Font.Light
opacity: !root.parkingStarted ? 1.0 : 0.0
@@ -104,7 +104,7 @@ ApplicationCCWindow {
Behavior on opacity { DefaultNumberAnimation {} }
Label {
- text: "Zone \nParking Olympia"
+ text: qsTr("Zone \nParking Olympia")
font.weight: Font.Light
color: "black"
}
@@ -153,7 +153,7 @@ ApplicationCCWindow {
}
Label {
- text: "2h, 14 minutes"
+ text: qsTr("2h, 14 minutes")
font.weight: Font.Light
opacity: Style.opacityHigh
color: "black"
@@ -206,7 +206,7 @@ ApplicationCCWindow {
spacing: Sizes.dp(50)
Label {
- text: "Zone"
+ text: qsTr("Zone")
font.weight: Font.Light
opacity: Style.opacityMedium
font.pixelSize: Sizes.fontSizeL
@@ -217,21 +217,21 @@ ApplicationCCWindow {
Column {
Label {
- text: "Every day 12 - 22"
+ text: qsTr("Every day 12 - 22")
font.weight: Font.Light
font.pixelSize: Sizes.fontSizeS
opacity: Style.opacityMedium
}
Label {
- text: "Other times"
+ text: qsTr("Other times")
font.weight: Font.Light
font.pixelSize: Sizes.fontSizeS
opacity: Style.opacityMedium
}
Label {
- text: "Service fee"
+ text: qsTr("Service fee")
font.weight: Font.Light
font.pixelSize: Sizes.fontSizeS
opacity: Style.opacityMedium
@@ -240,14 +240,14 @@ ApplicationCCWindow {
Column {
Label {
- text: "1.5 $ / started hour"
+ text: qsTr("1.5 $ / started hour")
font.weight: Font.Light
font.pixelSize: Sizes.fontSizeS
opacity: Style.opacityMedium
}
Label {
- text: "1 $ / started hour"
+ text: qsTr("1 $ / started hour")
font.weight: Font.Light
font.pixelSize: Sizes.fontSizeS
opacity: Style.opacityMedium
@@ -268,7 +268,7 @@ ApplicationCCWindow {
Label {
anchors.right: parent.right
- text: "1275, Parking Olympia"
+ text: qsTr("1275, Parking Olympia")
font.weight: Font.Light
opacity: Style.opacityMedium
}
@@ -280,7 +280,7 @@ ApplicationCCWindow {
font.pixelSize: Sizes.fontSizeM
checkable: true
checked: root.parkingStarted
- text: !root.parkingStarted ? "Start" : "End (2.29 $)"
+ text: !root.parkingStarted ? qsTr("Start") : qsTr("End (2.29 $)")
background: Rectangle {
color: {
@@ -321,7 +321,7 @@ ApplicationCCWindow {
anchors.topMargin: Sizes.dp(340)
font.pixelSize: Sizes.fontSizeM
- text: "Call for support"
+ text: qsTr("Call for support")
onClicked: sendIntent();
diff --git a/examples/neptune3ui/parking-app-tutorial/chapter2-extend/chapter2-extend.pro b/examples/neptune3ui/parking-app-tutorial/chapter2-extend/chapter2-extend.pro
index 3dea7173..bbc741af 100644
--- a/examples/neptune3ui/parking-app-tutorial/chapter2-extend/chapter2-extend.pro
+++ b/examples/neptune3ui/parking-app-tutorial/chapter2-extend/chapter2-extend.pro
@@ -5,10 +5,10 @@ FILES += info.yaml \
Main.qml
assets.files += assets/*
-assets.path = /apps/chapter2-extend/assets
+assets.path = $$[QT_INSTALL_EXAMPLES]/neptune3-ui/chapter2-extend/assets
app.files = $$FILES
-app.path = /apps/chapter2-extend
+app.path = $$[QT_INSTALL_EXAMPLES]/neptune3-ui/chapter2-extend
INSTALLS += app assets
diff --git a/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/app/Main.qml b/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/app/Main.qml
index b078c7b0..b1bb24e5 100644
--- a/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/app/Main.qml
+++ b/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/app/Main.qml
@@ -81,7 +81,7 @@ ApplicationCCWindow {
source: Style.image("app-fullscreen-top-bg", Style.theme)
Label {
- text: "No active parking tickets"
+ text: qsTr("No active parking tickets")
anchors.centerIn: parent
font.weight: Font.Light
opacity: !root.parkingStarted ? 1.0 : 0.0
@@ -106,7 +106,7 @@ ApplicationCCWindow {
Behavior on opacity { DefaultNumberAnimation {} }
Label {
- text: "Zone \nParking Olympia"
+ text: qsTr("Zone \nParking Olympia")
font.weight: Font.Light
color: "black"
}
@@ -155,7 +155,7 @@ ApplicationCCWindow {
}
Label {
- text: "2h, 14 minutes"
+ text: qsTr("2h, 14 minutes")
font.weight: Font.Light
opacity: Style.opacityHigh
color: "black"
@@ -208,7 +208,7 @@ ApplicationCCWindow {
spacing: Sizes.dp(50)
Label {
- text: "Zone"
+ text: qsTr("Zone")
font.weight: Font.Light
opacity: Style.opacityMedium
font.pixelSize: Sizes.fontSizeL
@@ -219,21 +219,21 @@ ApplicationCCWindow {
Column {
Label {
- text: "Every day 12 - 22"
+ text: qsTr("Every day 12 - 22")
font.weight: Font.Light
font.pixelSize: Sizes.fontSizeS
opacity: Style.opacityMedium
}
Label {
- text: "Other times"
+ text: qsTr("Other times")
font.weight: Font.Light
font.pixelSize: Sizes.fontSizeS
opacity: Style.opacityMedium
}
Label {
- text: "Service fee"
+ text: qsTr("Service fee")
font.weight: Font.Light
font.pixelSize: Sizes.fontSizeS
opacity: Style.opacityMedium
@@ -242,14 +242,14 @@ ApplicationCCWindow {
Column {
Label {
- text: "1.5 $ / started hour"
+ text: qsTr("1.5 $ / started hour")
font.weight: Font.Light
font.pixelSize: Sizes.fontSizeS
opacity: Style.opacityMedium
}
Label {
- text: "1 $ / started hour"
+ text: qsTr("1 $ / started hour")
font.weight: Font.Light
font.pixelSize: Sizes.fontSizeS
opacity: Style.opacityMedium
@@ -270,7 +270,7 @@ ApplicationCCWindow {
Label {
anchors.right: parent.right
- text: parkingInfo.freeLots + ", Parking Olympia"
+ text: parkingInfo.freeLots + qsTr(", Parking Olympia")
font.weight: Font.Light
opacity: Style.opacityMedium
}
@@ -282,7 +282,7 @@ ApplicationCCWindow {
font.pixelSize: Sizes.fontSizeM
checkable: true
checked: root.parkingStarted
- text: !root.parkingStarted ? "Start" : "End (2.29 $)"
+ text: !root.parkingStarted ? qsTr("Start") : qsTr("End (2.29 $)")
background: Rectangle {
color: {
@@ -322,7 +322,7 @@ ApplicationCCWindow {
anchors.topMargin: Sizes.dp(340)
font.pixelSize: Sizes.fontSizeM
- text: "Call for support"
+ text: qsTr("Call for support")
onClicked: sendIntent();
diff --git a/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/app/app.pro b/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/app/app.pro
index d51e4ba5..82e8ad6e 100644
--- a/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/app/app.pro
+++ b/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/app/app.pro
@@ -5,10 +5,10 @@ FILES += info.yaml \
Main.qml
assets.files += assets/*
-assets.path = /apps/chapter3-middleware/assets
+assets.path = $$[QT_INSTALL_EXAMPLES]/neptune3-ui/chapter3-middleware/assets
app.files = $$FILES
-app.path = /apps/chapter3-middleware
+app.path = $$[QT_INSTALL_EXAMPLES]/neptune3-ui/chapter3-middleware
INSTALLS += app assets
diff --git a/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/backend_simulator/backend_simulator.pro b/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/backend_simulator/backend_simulator.pro
index e873cc85..d3ce4870 100644
--- a/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/backend_simulator/backend_simulator.pro
+++ b/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/backend_simulator/backend_simulator.pro
@@ -16,7 +16,7 @@ PLUGIN_TYPE = qtivi
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH = $$OUT_PWD/../frontend/qml
-target.path = /apps/chapter3-middleware/qtivi
+target.path = $$[QT_INSTALL_EXAMPLES]/neptune3-ui/chapter3-middleware/qtivi
INSTALLS += target
RESOURCES += \
diff --git a/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/chapter3-middleware.pro b/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/chapter3-middleware.pro
index 38ea71bc..febe84ae 100644
--- a/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/chapter3-middleware.pro
+++ b/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/chapter3-middleware.pro
@@ -9,6 +9,6 @@ backend_simulator.depends = frontend
imports.depends = frontend
AM_MANIFEST = $$PWD/app/info.yaml
-AM_PACKAGE_DIR = /apps/chapter3-middleware
+AM_PACKAGE_DIR = $$[QT_INSTALL_EXAMPLES]/neptune3-ui/chapter3-middleware
load(am-app)
diff --git a/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/frontend/frontend.pro b/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/frontend/frontend.pro
index 0495af0d..62f2d4e7 100644
--- a/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/frontend/frontend.pro
+++ b/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/frontend/frontend.pro
@@ -11,5 +11,5 @@ QFACE_SOURCES = ../parking.qface
macos: QMAKE_SONAME_PREFIX = @rpath
-target.path = /apps/chapter3-middleware/
+target.path = $$[QT_INSTALL_EXAMPLES]/neptune3-ui/chapter3-middleware/
INSTALLS += target
diff --git a/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/imports/imports.pro b/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/imports/imports.pro
index 22886970..a45d8982 100644
--- a/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/imports/imports.pro
+++ b/examples/neptune3ui/parking-app-tutorial/chapter3-middleware/imports/imports.pro
@@ -20,7 +20,7 @@ exists($$OUT_PWD/qmldir) {
cpqmldir.CONFIG = no_check_exist
COPIES += cpqmldir
- installPath = /apps/chapter3-middleware/imports/$$replace(URI, \\., /)
+ installPath = $$[QT_INSTALL_EXAMPLES]/neptune3-ui/chapter3-middleware/imports/$$replace(URI, \\., /)
qmldir.files = $$OUT_PWD/qmldir \
$$OUT_PWD/plugins.qmltypes
qmldir.path = $$installPath
diff --git a/imports_shared/application/windows/NeptuneWindow.qml b/imports_shared/application/windows/NeptuneWindow.qml
index 9ee9a9bb..ae3f39e0 100644
--- a/imports_shared/application/windows/NeptuneWindow.qml
+++ b/imports_shared/application/windows/NeptuneWindow.qml
@@ -70,7 +70,7 @@ import shared.Sizes 1.0
ApplicationManagerWindow {
id: root
- LayoutMirroring.enabled: isRightToLeft || Config.rtlMode
+ LayoutMirroring.enabled: Config.rtlMode
LayoutMirroring.childrenInherit: true
color: "transparent"
@@ -80,7 +80,7 @@ ApplicationManagerWindow {
This property holds whether the current locale uses the right-to-left
text direction (RTL)
*/
- readonly property bool isRightToLeft: Qt.locale().textDirection === Qt.RightToLeft
+ readonly property bool isRightToLeft: Config.rtlMode
onWindowPropertyChanged: {
switch (name) {
diff --git a/imports_shared/assets/fonts/DejaVuSans-Bold.ttf b/imports_shared/assets/fonts/DejaVuSans-Bold.ttf
new file mode 100644
index 00000000..39699bd8
--- /dev/null
+++ b/imports_shared/assets/fonts/DejaVuSans-Bold.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b184b89e3c1075f22f6b71575b6fc20d4972b3cfd3b23322ca6fd596dcaef167
+size 704128
diff --git a/imports_shared/assets/fonts/DejaVuSans-BoldOblique.ttf b/imports_shared/assets/fonts/DejaVuSans-BoldOblique.ttf
new file mode 100644
index 00000000..cfd64ece
--- /dev/null
+++ b/imports_shared/assets/fonts/DejaVuSans-BoldOblique.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6edf0283160186af451cbee71e7b845f2e4cabf264bb992ce668c83c25465e6f
+size 641720
diff --git a/imports_shared/assets/fonts/DejaVuSans-ExtraLight.ttf b/imports_shared/assets/fonts/DejaVuSans-ExtraLight.ttf
new file mode 100644
index 00000000..d415e975
--- /dev/null
+++ b/imports_shared/assets/fonts/DejaVuSans-ExtraLight.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f42b3c8216c55d779e01148628e7ea247562c0bb8f8222a91079e1122621ed35
+size 355204
diff --git a/imports_shared/assets/fonts/DejaVuSans-Oblique.ttf b/imports_shared/assets/fonts/DejaVuSans-Oblique.ttf
new file mode 100644
index 00000000..4ddf1fab
--- /dev/null
+++ b/imports_shared/assets/fonts/DejaVuSans-Oblique.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ccdf74b350f11fd3dd5774de50e5e6346a1a5da1f5b7d5fb83590665e97a5213
+size 633840
diff --git a/imports_shared/assets/fonts/DejaVuSans.ttf b/imports_shared/assets/fonts/DejaVuSans.ttf
new file mode 100644
index 00000000..f47aa8cf
--- /dev/null
+++ b/imports_shared/assets/fonts/DejaVuSans.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3fdf69cabf06049ea70a00b5919340e2ce1e6d02b0cc3c4b44fb6801bd1e0d22
+size 756072
diff --git a/imports_shared/assets/fonts/DejaVuSansCondensed-Bold.ttf b/imports_shared/assets/fonts/DejaVuSansCondensed-Bold.ttf
new file mode 100644
index 00000000..01e81951
--- /dev/null
+++ b/imports_shared/assets/fonts/DejaVuSansCondensed-Bold.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fba1a6b839f32422661fe5f508fd694ae5f14f33d6c16d2e4fcd30c88bd3cb74
+size 663468
diff --git a/imports_shared/assets/fonts/DejaVuSansCondensed-BoldOblique.ttf b/imports_shared/assets/fonts/DejaVuSansCondensed-BoldOblique.ttf
new file mode 100644
index 00000000..5a11fee3
--- /dev/null
+++ b/imports_shared/assets/fonts/DejaVuSansCondensed-BoldOblique.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a4c75215beb7e090b5e3902fc9a2a4297764b092b1820faf2f3d711d95b93671
+size 610264
diff --git a/imports_shared/assets/fonts/DejaVuSansCondensed-Oblique.ttf b/imports_shared/assets/fonts/DejaVuSansCondensed-Oblique.ttf
new file mode 100644
index 00000000..1d765cbe
--- /dev/null
+++ b/imports_shared/assets/fonts/DejaVuSansCondensed-Oblique.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:20e2588067322bddb6df93469bc4d599d8341fde4e520b85c17acb1764b16a65
+size 597716
diff --git a/imports_shared/assets/fonts/DejaVuSansCondensed.ttf b/imports_shared/assets/fonts/DejaVuSansCondensed.ttf
new file mode 100644
index 00000000..bfe946a0
--- /dev/null
+++ b/imports_shared/assets/fonts/DejaVuSansCondensed.ttf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:010bf8acab1452ca253e162cae4ae26bbc8f07580f6529bee4cc4b35c5927398
+size 679256
diff --git a/imports_shared/assets/fonts/LICENSE b/imports_shared/assets/fonts/LICENSE
new file mode 100644
index 00000000..e5fd55a0
--- /dev/null
+++ b/imports_shared/assets/fonts/LICENSE
@@ -0,0 +1,99 @@
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
+
+Bitstream Vera Fonts Copyright
+------------------------------
+
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
+a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated
+documentation files (the "Font Software"), to reproduce and distribute the
+Font Software, including without limitation the rights to use, copy, merge,
+publish, distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to the
+following conditions:
+
+The above copyright and trademark notices and this permission notice shall
+be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the fonts
+are renamed to names not containing either the words "Bitstream" or the word
+"Vera".
+
+This License becomes null and void to the extent applicable to Fonts or Font
+Software that has been modified and is distributed under the "Bitstream
+Vera" names.
+
+The Font Software may be sold as part of a larger software package but no
+copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
+FONT SOFTWARE.
+
+Except as contained in this notice, the names of Gnome, the Gnome
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the Gnome Foundation or Bitstream
+Inc., respectively. For further information, contact: fonts at gnome dot
+org.
+
+Arev Fonts Copyright
+------------------------------
+
+Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the fonts accompanying this license ("Fonts") and
+associated documentation files (the "Font Software"), to reproduce
+and distribute the modifications to the Bitstream Vera Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software
+typefaces.
+
+The Font Software may be modified, altered, or added to, and in
+particular the designs of glyphs or characters in the Fonts may be
+modified and additional glyphs or characters may be added to the
+Fonts, only if the fonts are renamed to names not containing either
+the words "Tavmjong Bah" or the word "Arev".
+
+This License becomes null and void to the extent applicable to Fonts
+or Font Software that has been modified and is distributed under the
+"Tavmjong Bah Arev" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by
+itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
+TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+Except as contained in this notice, the name of Tavmjong Bah shall not
+be used in advertising or otherwise to promote the sale, use or other
+dealings in this Font Software without prior written authorization
+from Tavmjong Bah. For further information, contact: tavmjong @ free
+. fr.
+
+$Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $
diff --git a/imports_shared/assets/fonts/LICENSE.txt b/imports_shared/assets/fonts/LICENSE.txt
deleted file mode 100644
index d6456956..00000000
--- a/imports_shared/assets/fonts/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/imports_shared/assets/fonts/OpenSans-Bold.ttf b/imports_shared/assets/fonts/OpenSans-Bold.ttf
deleted file mode 100644
index f29ca129..00000000
--- a/imports_shared/assets/fonts/OpenSans-Bold.ttf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1b43de2449d39b65ff6f63315d4afda585f72fbbec2e3d9a56f59de6c75149d3
-size 224452
diff --git a/imports_shared/assets/fonts/OpenSans-BoldItalic.ttf b/imports_shared/assets/fonts/OpenSans-BoldItalic.ttf
deleted file mode 100644
index 2ba527c9..00000000
--- a/imports_shared/assets/fonts/OpenSans-BoldItalic.ttf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3575d2afaaad69970380237a5d6357b6db241f53b77607482eaf9f299b8c07ec
-size 213168
diff --git a/imports_shared/assets/fonts/OpenSans-ExtraBold.ttf b/imports_shared/assets/fonts/OpenSans-ExtraBold.ttf
deleted file mode 100644
index a3e7e2da..00000000
--- a/imports_shared/assets/fonts/OpenSans-ExtraBold.ttf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:395f150240d43dff8baea6586baf5665337de57b8204a501fbd6148b2fe165b7
-size 222424
diff --git a/imports_shared/assets/fonts/OpenSans-ExtraBoldItalic.ttf b/imports_shared/assets/fonts/OpenSans-ExtraBoldItalic.ttf
deleted file mode 100644
index ed0c9553..00000000
--- a/imports_shared/assets/fonts/OpenSans-ExtraBoldItalic.ttf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d5de39bcdd010089d9db8dd1aebaefaf9e691bf9a49282ff43e1d1869b417892
-size 213336
diff --git a/imports_shared/assets/fonts/OpenSans-Italic.ttf b/imports_shared/assets/fonts/OpenSans-Italic.ttf
deleted file mode 100644
index 1ea7e897..00000000
--- a/imports_shared/assets/fonts/OpenSans-Italic.ttf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6cb918a707a06c4f98221d09344af4b98c9cb6184b13309a579caf0418d5eb74
-size 212760
diff --git a/imports_shared/assets/fonts/OpenSans-Light.ttf b/imports_shared/assets/fonts/OpenSans-Light.ttf
deleted file mode 100644
index d8a4f461..00000000
--- a/imports_shared/assets/fonts/OpenSans-Light.ttf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1c8d3cc6810ecd3623ebff7d2c3db1a44024260c5ae662f8166d69b9425828ed
-size 222236
diff --git a/imports_shared/assets/fonts/OpenSans-LightItalic.ttf b/imports_shared/assets/fonts/OpenSans-LightItalic.ttf
deleted file mode 100644
index 59dbe189..00000000
--- a/imports_shared/assets/fonts/OpenSans-LightItalic.ttf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fda70df85987b394ff384b899703bc0e55ac7bdba94d06f47462e155cf0c0350
-size 213024
diff --git a/imports_shared/assets/fonts/OpenSans-Regular.ttf b/imports_shared/assets/fonts/OpenSans-Regular.ttf
deleted file mode 100644
index e210b6b1..00000000
--- a/imports_shared/assets/fonts/OpenSans-Regular.ttf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:13c03e22a633919beb2847c58c8285fb8a735ee97097d7c48fd403f8294b05f8
-size 217276
diff --git a/imports_shared/assets/fonts/OpenSans-SemiBold.ttf b/imports_shared/assets/fonts/OpenSans-SemiBold.ttf
deleted file mode 100644
index 7f2753ed..00000000
--- a/imports_shared/assets/fonts/OpenSans-SemiBold.ttf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b4c2050b25d3d296d5cf58589ca00816dc72df42262c2f629d5c6a984a161aa4
-size 221164
diff --git a/imports_shared/assets/fonts/OpenSans-SemiBoldItalic.ttf b/imports_shared/assets/fonts/OpenSans-SemiBoldItalic.ttf
deleted file mode 100644
index dad16326..00000000
--- a/imports_shared/assets/fonts/OpenSans-SemiBoldItalic.ttf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a8f2af8e79f46686b1cfcfb3a1fd53e94e88308d7c6ee7f85c733f4796fcc3a0
-size 212732
diff --git a/imports_shared/assets/icons/lucee/sysui/ic-addwidget-plus.png b/imports_shared/assets/icons/lucee/sysui/ic-addwidget-plus.png
index 213b7b31..8c40ea5b 100644
--- a/imports_shared/assets/icons/lucee/sysui/ic-addwidget-plus.png
+++ b/imports_shared/assets/icons/lucee/sysui/ic-addwidget-plus.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c2b4998a5b64d7da687b2304ccf54e92159dde60b82611caa201fce61165d4da
-size 142
+oid sha256:d462aac1c34ff99f27d55cd2016a79c1a7c077930c0caf38ebf1823a8cabd33a
+size 159
diff --git a/imports_shared/assets/icons/lucee/sysui/ic-close.png b/imports_shared/assets/icons/lucee/sysui/ic-close.png
index 0ae27f28..06a4389b 100644
--- a/imports_shared/assets/icons/lucee/sysui/ic-close.png
+++ b/imports_shared/assets/icons/lucee/sysui/ic-close.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3f87ef9320171f1e0b1bef83c0800f6a4527c24fd142dbcf86a195cf2a2400c9
-size 374
+oid sha256:1bc36a17c6ca76e9d1e0714fb763656ff032b1e098dee29e779fb70895b5b8a2
+size 406
diff --git a/imports_shared/assets/icons/lucee/sysui/ic-connectivity_OFF.png b/imports_shared/assets/icons/lucee/sysui/ic-connectivity_OFF.png
new file mode 100644
index 00000000..fa429c0f
--- /dev/null
+++ b/imports_shared/assets/icons/lucee/sysui/ic-connectivity_OFF.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:106662dd1cc64d00a72a667ed46c2a901092149e10c9c567617ac9d3972e136d
+size 937
diff --git a/imports_shared/assets/icons/lucee/sysui/ic-connectivity_ON.png b/imports_shared/assets/icons/lucee/sysui/ic-connectivity_ON.png
new file mode 100644
index 00000000..a39fb596
--- /dev/null
+++ b/imports_shared/assets/icons/lucee/sysui/ic-connectivity_ON.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a36a7c8d906d9aa642e1b54cab6472f6f4d241060ecf9ab5417202b157b4f82b
+size 850
diff --git a/imports_shared/assets/icons/lucee/sysui/ic-remove.png b/imports_shared/assets/icons/lucee/sysui/ic-remove.png
new file mode 100644
index 00000000..fb2aca63
--- /dev/null
+++ b/imports_shared/assets/icons/lucee/sysui/ic-remove.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2720ca67ecc14346288ce3f5d6e8c86c4ef4604cd990f741b1a61c844f80e7d3
+size 526
diff --git a/imports_shared/assets/icons/neptune/sysui/ic-addwidget-plus.png b/imports_shared/assets/icons/neptune/sysui/ic-addwidget-plus.png
index 213b7b31..8c40ea5b 100644
--- a/imports_shared/assets/icons/neptune/sysui/ic-addwidget-plus.png
+++ b/imports_shared/assets/icons/neptune/sysui/ic-addwidget-plus.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c2b4998a5b64d7da687b2304ccf54e92159dde60b82611caa201fce61165d4da
-size 142
+oid sha256:d462aac1c34ff99f27d55cd2016a79c1a7c077930c0caf38ebf1823a8cabd33a
+size 159
diff --git a/imports_shared/assets/icons/neptune/sysui/ic-close.png b/imports_shared/assets/icons/neptune/sysui/ic-close.png
index 8d2d4c90..c9380f62 100644
--- a/imports_shared/assets/icons/neptune/sysui/ic-close.png
+++ b/imports_shared/assets/icons/neptune/sysui/ic-close.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:cd37eaf5ceb0825c7b35ab9eb178358aadbc3e8179beae5dfe905544edbeb941
-size 357
+oid sha256:660de08f072e2431777f8fdfe91fbcee41470f400333419e09917084e38b4a7c
+size 344
diff --git a/imports_shared/assets/icons/neptune/sysui/ic-connectivity_OFF.png b/imports_shared/assets/icons/neptune/sysui/ic-connectivity_OFF.png
index f6b51e18..fa429c0f 100644
--- a/imports_shared/assets/icons/neptune/sysui/ic-connectivity_OFF.png
+++ b/imports_shared/assets/icons/neptune/sysui/ic-connectivity_OFF.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:13e49591991166a6aff1ebb4d465ffa3c00c58d1c29d80c1bc89e65c95a67e9f
-size 939
+oid sha256:106662dd1cc64d00a72a667ed46c2a901092149e10c9c567617ac9d3972e136d
+size 937
diff --git a/imports_shared/assets/icons/neptune/sysui/ic-menu-allapps.png b/imports_shared/assets/icons/neptune/sysui/ic-menu-allapps.png
index 6b1fb8ca..d559b16d 100644
--- a/imports_shared/assets/icons/neptune/sysui/ic-menu-allapps.png
+++ b/imports_shared/assets/icons/neptune/sysui/ic-menu-allapps.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:aadc751cea30c52b04c7726ec98e6fa978bb5a25d5cf70045c02c38ee786acb7
-size 188
+oid sha256:1e4c055e25ed7a84fd9f142d503cd2b7b543adcee843e4bc7911396280f2e8b0
+size 211
diff --git a/imports_shared/assets/icons/neptune/sysui/ic-menu-home.png b/imports_shared/assets/icons/neptune/sysui/ic-menu-home.png
index e314e45e..3209774a 100644
--- a/imports_shared/assets/icons/neptune/sysui/ic-menu-home.png
+++ b/imports_shared/assets/icons/neptune/sysui/ic-menu-home.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e7c6d6a16a43814b94fe545f8c2844e62b3d3223f1e7c8955c07ac66c56372a9
-size 707
+oid sha256:a3231bdc6fa0338cdfd9dded6858e64cb097099cc1990b9bf0058ac4ad40f20f
+size 633
diff --git a/imports_shared/assets/icons/neptune/sysui/ic-remove.png b/imports_shared/assets/icons/neptune/sysui/ic-remove.png
new file mode 100644
index 00000000..fb2aca63
--- /dev/null
+++ b/imports_shared/assets/icons/neptune/sysui/ic-remove.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2720ca67ecc14346288ce3f5d6e8c86c4ef4604cd990f741b1a61c844f80e7d3
+size 526
diff --git a/imports_shared/assets/translations/ar_MA.ts b/imports_shared/assets/translations/ar_MA.ts
index a72ff8de..b66893f3 100644
--- a/imports_shared/assets/translations/ar_MA.ts
+++ b/imports_shared/assets/translations/ar_MA.ts
@@ -140,6 +140,23 @@
</message>
</context>
<context>
+ <name>CalendarMaximizedPanel</name>
+ <message>
+ <source>Partly sunny, 21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Today: Mostly sunny,
+the highest temperature will be 26°.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tonight: Mostly cloudy with light rain,
+temperatures between 14° and 18°.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>CalendarToolsColumn</name>
<message>
<source>year</source>
@@ -160,6 +177,14 @@
<source>Partly cloudy</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Partly sunny, 21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>CenterConsoleMonitorOverlay</name>
@@ -195,6 +220,21 @@
</message>
</context>
<context>
+ <name>ConnectivityPanel</name>
+ <message>
+ <source>Wi-Fi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hotspot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bluetooth</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>CpuMonitor</name>
<message>
<source>CPU: </source>
@@ -254,6 +294,28 @@
</message>
</context>
<context>
+ <name>DownloadAppList</name>
+ <message>
+ <source>update</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DownloadsStates</name>
+ <message>
+ <source>Login Failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fetching categories error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fetching apps error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>DownloadsStore</name>
<message>
<source>%1 Bytes</source>
@@ -311,6 +373,30 @@
<source>%1 successfully uninstalled</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>built-in</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unknown size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 Successfully updated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 successfully updated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 Updates successfully Uninstalled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 updates successfully uninstalled</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DownloadsView</name>
@@ -328,7 +414,7 @@
</message>
<message>
<source>No apps found!</source>
- <translation>لا وجود لتطبيقات!</translation>
+ <translation type="vanished">لا وجود لتطبيقات!</translation>
</message>
<message>
<source>A Network connection is required</source>
@@ -342,6 +428,22 @@
<source>Retry</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Connecting to server...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Server is not available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Server is on Maintance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No apps</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DrivingModeRange</name>
@@ -400,10 +502,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Show on map</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>21</source>
<translation type="unfinished"></translation>
</message>
@@ -423,6 +521,10 @@
<source>Faiss Dr, Las Vegas</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Open map</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FavDestinationButtonsPanel</name>
@@ -434,6 +536,14 @@
<source>Work</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Welandergatan 29</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Östra Hamngatan 16</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FavoritesWidgetView</name>
@@ -455,6 +565,21 @@
</message>
</context>
<context>
+ <name>FullScreenBottomView</name>
+ <message>
+ <source>Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Artist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Album</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>FullScreenTopView</name>
<message>
<source>Next</source>
@@ -474,6 +599,36 @@
</message>
</context>
<context>
+ <name>HotspotPanel</name>
+ <message>
+ <source>Hotspot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hotspot Enabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SSID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ICMapView</name>
+ <message>
+ <source>Next turn: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The map is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>ICMusicView</name>
<message>
<source>Track unavailable</source>
@@ -483,10 +638,6 @@
<context>
<name>Main</name>
<message>
- <source>km/h</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Instrument Cluster</source>
<translation>وحدة المراقبة</translation>
</message>
@@ -499,6 +650,63 @@
Please extend your parking ticket or move your car.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No active parking tickets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zone
+Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2h, 14 minutes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Every day 12 - 22</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Other times</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Service fee</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1.5 $ / started hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1 $ / started hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1275, Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>End (2.29 $)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call for support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>, Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>MapStore</name>
@@ -572,6 +780,13 @@
</message>
</context>
<context>
+ <name>MapView</name>
+ <message>
+ <source>The map is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>MonitorOverlay</name>
<message>
<source>FPS: %1</source>
@@ -673,6 +888,14 @@
<source>Unknown Album</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Music</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AM/FM Radio</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>MusicToolsColumn</name>
@@ -724,6 +947,17 @@
</message>
</context>
<context>
+ <name>NavigationStore</name>
+ <message>
+ <source>km</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>NotificationCenter</name>
<message>
<source>No Notifications</source>
@@ -767,11 +1001,11 @@
<context>
<name>RoofPanel</name>
<message>
- <source>Open</source>
+ <source>Close</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Close</source>
+ <source>Open</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -825,6 +1059,26 @@
<source>Dark</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>UI Accent Color changed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Accent Color changed into %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed into Light Theme</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed into Dark Theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>SearchOverlayPanel</name>
@@ -875,7 +1129,14 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>connectivity</source>
+ <source>network</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SpeedPanel</name>
+ <message>
+ <source>km/h</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -943,6 +1204,14 @@
<source>MHz</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>AM/FM Radio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TunerToolsColumn</name>
@@ -1033,4 +1302,60 @@
<translation type="unfinished"></translation>
</message>
</context>
+<context>
+ <name>VehicleView</name>
+ <message>
+ <source>The 3D car model is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WiFiPanel</name>
+ <message>
+ <source>Wi-Fi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wi-Fi Enabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WiFiPopup</name>
+ <message>
+ <source>Input password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Manual connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SSID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WidgetContentView</name>
+ <message>
+ <source>Discover similar music</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
</TS>
diff --git a/imports_shared/assets/translations/cs_CZ.ts b/imports_shared/assets/translations/cs_CZ.ts
index fc53a094..fbff46dc 100644
--- a/imports_shared/assets/translations/cs_CZ.ts
+++ b/imports_shared/assets/translations/cs_CZ.ts
@@ -247,6 +247,23 @@ UX na cestu</translation>
</message>
</context>
<context>
+ <name>CalendarMaximizedPanel</name>
+ <message>
+ <source>Partly sunny, 21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Today: Mostly sunny,
+the highest temperature will be 26°.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tonight: Mostly cloudy with light rain,
+temperatures between 14° and 18°.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>CalendarToolsColumn</name>
<message>
<source>year</source>
@@ -350,6 +367,14 @@ UX na cestu</translation>
<source>Partly cloudy</source>
<translation>Částečně zataženo</translation>
</message>
+ <message>
+ <source>Partly sunny, 21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>CalendarWidgetView</name>
@@ -477,6 +502,21 @@ UX na cestu</translation>
</message>
</context>
<context>
+ <name>ConnectivityPanel</name>
+ <message>
+ <source>Wi-Fi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hotspot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bluetooth</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>CpuMonitor</name>
<message>
<source>CPU: </source>
@@ -566,6 +606,28 @@ UX na cestu</translation>
</message>
</context>
<context>
+ <name>DownloadAppList</name>
+ <message>
+ <source>update</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DownloadsStates</name>
+ <message>
+ <source>Login Failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fetching categories error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fetching apps error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>DownloadsStore</name>
<message>
<source>%1 Successfully Installed</source>
@@ -623,6 +685,30 @@ UX na cestu</translation>
<source>%1 GB</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>built-in</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unknown size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 Successfully updated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 successfully updated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 Updates successfully Uninstalled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 updates successfully uninstalled</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DownloadsView</name>
@@ -640,7 +726,7 @@ UX na cestu</translation>
</message>
<message>
<source>No apps found!</source>
- <translation type="unfinished">Žádné aplikace nenalezeny!</translation>
+ <translation type="obsolete">Žádné aplikace nenalezeny!</translation>
</message>
<message>
<source>A Network connection is required</source>
@@ -654,6 +740,22 @@ UX na cestu</translation>
<source>Retry</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Connecting to server...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Server is not available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Server is on Maintance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No apps</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DrivingModeRange</name>
@@ -713,7 +815,7 @@ UX na cestu</translation>
</message>
<message>
<source>Show on map</source>
- <translation>Zobrazit na mapě</translation>
+ <translation type="vanished">Zobrazit na mapě</translation>
</message>
<message>
<source>21</source>
@@ -735,6 +837,10 @@ UX na cestu</translation>
<source>Faiss Dr, Las Vegas</source>
<translation>Faiss Dr, Las Vegas</translation>
</message>
+ <message>
+ <source>Open map</source>
+ <translation>Otevřít mapu</translation>
+ </message>
</context>
<context>
<name>FavDestinationButtonsPanel</name>
@@ -746,6 +852,14 @@ UX na cestu</translation>
<source>Work</source>
<translation>Práce</translation>
</message>
+ <message>
+ <source>Welandergatan 29</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Östra Hamngatan 16</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FavoriteDestinationButtons</name>
@@ -822,6 +936,18 @@ UX na cestu</translation>
<source>%1 (%2)</source>
<translation type="vanished">%1 (%2)</translation>
</message>
+ <message>
+ <source>Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Artist</source>
+ <translation type="unfinished">Umělec</translation>
+ </message>
+ <message>
+ <source>Album</source>
+ <translation type="unfinished">Album</translation>
+ </message>
</context>
<context>
<name>FullScreenTopView</name>
@@ -861,6 +987,40 @@ UX na cestu</translation>
</message>
</context>
<context>
+ <name>HotspotPanel</name>
+ <message>
+ <source>Hotspot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hotspot Enabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SSID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ICMapView</name>
+ <message>
+ <source>km</source>
+ <translation type="obsolete">km</translation>
+ </message>
+ <message>
+ <source>Next turn: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The map is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>ICMusicView</name>
<message>
<source>Track unavailable</source>
@@ -948,7 +1108,7 @@ UX na cestu</translation>
</message>
<message>
<source>km/h</source>
- <translation type="unfinished">km/h</translation>
+ <translation type="obsolete">km/h</translation>
</message>
<message>
<source>Your parking period is about to end</source>
@@ -959,6 +1119,70 @@ UX na cestu</translation>
Please extend your parking ticket or move your car.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No active parking tickets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zone
+Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2h, 14 minutes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Every day 12 - 22</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Other times</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Service fee</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1.5 $ / started hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1 $ / started hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1275, Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>End (2.29 $)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call for support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>, Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MainView</name>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">km/h</translation>
+ </message>
</context>
<context>
<name>MapHeader</name>
@@ -1103,6 +1327,10 @@ UX na cestu</translation>
<source>Work</source>
<translation type="vanished">Práce</translation>
</message>
+ <message>
+ <source>The map is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Maps</name>
@@ -1359,6 +1587,14 @@ UX na cestu</translation>
<source>Unknown Album</source>
<translation>Neznámé album</translation>
</message>
+ <message>
+ <source>Music</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AM/FM Radio</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>MusicToolsColumn</name>
@@ -1399,6 +1635,13 @@ UX na cestu</translation>
</message>
</context>
<context>
+ <name>NaviPanel</name>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">km/h</translation>
+ </message>
+</context>
+<context>
<name>NavigationConfirm</name>
<message>
<source>Start Navigation</source>
@@ -1451,6 +1694,17 @@ UX na cestu</translation>
</message>
</context>
<context>
+ <name>NavigationStore</name>
+ <message>
+ <source>km</source>
+ <translation type="unfinished">km</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>NetworkMonitor</name>
<message>
<source>Network</source>
@@ -1612,11 +1866,11 @@ UX na cestu</translation>
</message>
<message>
<source>UI Accent Color changed</source>
- <translation type="vanished">Barva zvýraznění UI změněna</translation>
+ <translation>Barva zvýraznění UI změněna</translation>
</message>
<message>
<source>UI Accent Color changed into %1</source>
- <translation type="vanished">Barva zvýraznění UI změněna na %1</translation>
+ <translation>Barva zvýraznění UI změněna na %1</translation>
</message>
<message>
<source>UI Language changed</source>
@@ -1624,15 +1878,15 @@ UX na cestu</translation>
</message>
<message>
<source>UI Theme changed</source>
- <translation type="vanished">Motiv UI změněn</translation>
+ <translation>Motiv UI změněn</translation>
</message>
<message>
<source>UI Theme changed into Light Theme</source>
- <translation type="vanished">Motiv UI změněn na světlý</translation>
+ <translation>Motiv UI změněn na světlý</translation>
</message>
<message>
<source>UI Theme changed into Dark Theme</source>
- <translation type="vanished">Motiv UI změněn na tmavý</translation>
+ <translation>Motiv UI změněn na tmavý</translation>
</message>
<message>
<source>UI Language changed into %1 (%2)</source>
@@ -1778,11 +2032,18 @@ UX na cestu</translation>
<translation>barvy</translation>
</message>
<message>
- <source>connectivity</source>
+ <source>network</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
+ <name>SpeedPanel</name>
+ <message>
+ <source>km/h</source>
+ <translation type="unfinished">km/h</translation>
+ </message>
+</context>
+<context>
<name>StatusBar</name>
<message>
<source>FPS: %1</source>
@@ -1945,6 +2206,14 @@ UX na cestu</translation>
<source>MHz</source>
<translation>MHz</translation>
</message>
+ <message>
+ <source>AM/FM Radio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TunerToolsColumn</name>
@@ -2205,6 +2474,13 @@ UX na cestu</translation>
</message>
</context>
<context>
+ <name>VehicleView</name>
+ <message>
+ <source>The 3D car model is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>VehicleWidgetModel</name>
<message>
<source>Fees</source>
@@ -2230,4 +2506,53 @@ UX na cestu</translation>
<translation type="vanished">Zadejte adresu</translation>
</message>
</context>
+<context>
+ <name>WiFiPanel</name>
+ <message>
+ <source>Wi-Fi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wi-Fi Enabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WiFiPopup</name>
+ <message>
+ <source>Input password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Manual connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SSID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WidgetContentView</name>
+ <message>
+ <source>Discover similar music</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
</TS>
diff --git a/imports_shared/assets/translations/de_DE.ts b/imports_shared/assets/translations/de_DE.ts
index 25eb1a8e..55b22edf 100644
--- a/imports_shared/assets/translations/de_DE.ts
+++ b/imports_shared/assets/translations/de_DE.ts
@@ -20,51 +20,51 @@
<name>AboutApps</name>
<message>
<source>Enabling performance monitoring forces the chosen application to constantly redraw itself, therefore having a constant, unnecessary, GPU/CPU consumption.</source>
- <translation type="unfinished"></translation>
+ <translation>Aktivierung der Leistungsüberwachung zwingt die gewählte App zum konstanten Neuzeichnen. Dies führt zum konstanten, nicht notwendigen GPU/CPU-Verbrauch.</translation>
</message>
<message>
<source>Center Console Window</source>
- <translation type="unfinished"></translation>
+ <translation>Mittelkonsolenfenster</translation>
</message>
<message>
<source>Bottom Bar Window</source>
- <translation type="unfinished"></translation>
+ <translation>Unteres Funktionsleistenfenster</translation>
</message>
<message>
<source>HUD Window</source>
- <translation type="unfinished"></translation>
+ <translation>HUD-Fenster</translation>
</message>
<message>
<source>Instrument Cluster Window</source>
- <translation type="unfinished"></translation>
+ <translation>Kombiinstrumentfenster</translation>
</message>
<message>
<source>No Window</source>
- <translation type="unfinished"></translation>
+ <translation>Kein Fenster</translation>
</message>
<message>
<source>CPU: %L1 %; RSS: %L3 MB; PSS: %L4 MB</source>
- <translation type="unfinished"></translation>
+ <translation>CPU: %L1 %; RSS: %L3 MB; PSS: %L4 MB</translation>
</message>
<message>
<source>Time to first frame: %1 ms</source>
- <translation type="unfinished"></translation>
+ <translation>Zeit zum ersten Frame: %1 ms</translation>
</message>
<message>
<source>Performance monitor</source>
- <translation type="unfinished"></translation>
+ <translation>Leistungsüberwachung</translation>
</message>
<message>
<source>Autostart</source>
- <translation type="unfinished"></translation>
+ <translation>Autostart</translation>
</message>
<message>
<source>Autorecover</source>
- <translation type="unfinished"></translation>
+ <translation>automatische Wiederherstellung</translation>
</message>
<message>
<source>N/A</source>
- <translation type="unfinished"></translation>
+ <translation>n.z</translation>
</message>
<message>
<source>Unknown app</source>
@@ -75,22 +75,22 @@
<name>AboutPerformance</name>
<message>
<source>Center Console Performance Overlay</source>
- <translation type="unfinished"></translation>
+ <translation>Leistungsüberlagerung der Mittelkonsole</translation>
</message>
<message>
<source>Instrument Cluster Performance Overlay</source>
- <translation type="unfinished"></translation>
+ <translation>Leistungsüberlagerung des Kombiinstruments</translation>
</message>
<message>
<source>Enabling performance monitoring forces System UI to constantly redraw itself, therefore having a constant, unnecessary, GPU/CPU consumption.</source>
- <translation type="unfinished"></translation>
+ <translation>Aktivierung der Leistunsmonitoring zwingt das System UI zum konstanten Neuzeichnen. Dies führt zum konstanten, nicht nötigen GPU/CPU-Verbrauch.</translation>
</message>
</context>
<context>
<name>AboutPopup</name>
<message>
<source>System</source>
- <translation type="unfinished"></translation>
+ <translation>System</translation>
</message>
<message>
<source>Running Apps</source>
@@ -98,15 +98,15 @@
</message>
<message>
<source>Performance</source>
- <translation type="unfinished"></translation>
+ <translation>Leistung</translation>
</message>
<message>
<source>Diagnostics</source>
- <translation type="unfinished"></translation>
+ <translation>Diagnose</translation>
</message>
<message>
<source>Apps</source>
- <translation type="unfinished"></translation>
+ <translation>Apps</translation>
</message>
</context>
<context>
@@ -121,7 +121,7 @@
<message>
<source>Application window of %1 is not available.
Please remove the widget and try to restart the application</source>
- <translation type="unfinished"></translation>
+ <translation>App-Fenster für %1 ist nicht verfügbar. Bitte entfernen Sie das Widget und versuchen Sie die App neu zu starten</translation>
</message>
</context>
<context>
@@ -132,14 +132,14 @@
</message>
<message>
<source>No more widgets available.</source>
- <translation type="unfinished"></translation>
+ <translation>Es sind keine Widgets mehr verfügbar.</translation>
</message>
</context>
<context>
<name>AlbumArtPanel</name>
<message>
<source>There is no music available</source>
- <translation type="unfinished"></translation>
+ <translation>Keine Musik ist verfügbar</translation>
</message>
</context>
<context>
@@ -157,6 +157,23 @@
</message>
</context>
<context>
+ <name>CalendarMaximizedPanel</name>
+ <message>
+ <source>Partly sunny, 21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Today: Mostly sunny,
+the highest temperature will be 26°.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tonight: Mostly cloudy with light rain,
+temperatures between 14° and 18°.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>CalendarToolsColumn</name>
<message>
<source>year</source>
@@ -210,6 +227,14 @@
</message>
<message>
<source>Partly cloudy</source>
+ <translation>Teilweise bewölkt</translation>
+ </message>
+ <message>
+ <source>Partly sunny, 21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>21°C</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -236,15 +261,15 @@
<name>CenterConsoleMonitorOverlay</name>
<message>
<source>CPU: %1 %</source>
- <translation type="unfinished">CPU: %1 %</translation>
+ <translation>CPU: %1 %</translation>
</message>
<message>
<source>RAM: %1 MB (%2 %)</source>
- <translation type="unfinished">RAM: %1 MB (%2 %)</translation>
+ <translation>RAM: %1 MB (%2 %)</translation>
</message>
<message>
<source>System</source>
- <translation type="unfinished"></translation>
+ <translation>System</translation>
</message>
</context>
<context>
@@ -270,18 +295,18 @@
<name>ClimateButtonsGridPanel</name>
<message>
<source>DRIVER</source>
- <translation type="unfinished"></translation>
+ <translation>FAHRER</translation>
</message>
<message>
<source>PASSENGER</source>
- <translation type="unfinished"></translation>
+ <translation>FAHRGAST</translation>
</message>
</context>
<context>
<name>ClimateContentPanel</name>
<message>
<source>Auto</source>
- <translation type="unfinished"></translation>
+ <translation>Auto</translation>
</message>
</context>
<context>
@@ -318,14 +343,29 @@
</message>
</context>
<context>
+ <name>ConnectivityPanel</name>
+ <message>
+ <source>Wi-Fi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hotspot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bluetooth</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>CpuMonitor</name>
<message>
<source>CPU: </source>
- <translation type="unfinished"></translation>
+ <translation>CPU: </translation>
</message>
<message>
<source>50%</source>
- <translation type="unfinished">50%</translation>
+ <translation>50%</translation>
</message>
</context>
<context>
@@ -362,11 +402,11 @@
<name>DialPowerPanel</name>
<message>
<source>% power</source>
- <translation type="unfinished">% energy</translation>
+ <translation>% Energie</translation>
</message>
<message>
<source>km</source>
- <translation type="unfinished">Km</translation>
+ <translation>Km</translation>
</message>
</context>
<context>
@@ -380,22 +420,22 @@
<name>DialSpeedPanel</name>
<message>
<source>km/h</source>
- <translation type="unfinished">Km/h</translation>
+ <translation>Km/h</translation>
</message>
</context>
<context>
<name>DoorsPanel</name>
<message>
<source>Sun roof</source>
- <translation type="unfinished">Sonnendach</translation>
+ <translation>Sonnendach</translation>
</message>
<message>
<source>Doors</source>
- <translation type="unfinished">Türen</translation>
+ <translation>Türen</translation>
</message>
<message>
<source>Trunk</source>
- <translation type="unfinished">Gepäckraum</translation>
+ <translation>Kofferraum</translation>
</message>
<message>
<source>Close</source>
@@ -407,88 +447,150 @@
</message>
</context>
<context>
+ <name>DownloadAppList</name>
+ <message>
+ <source>update</source>
+ <translation>Aktualisierung</translation>
+ </message>
+</context>
+<context>
+ <name>DownloadsStates</name>
+ <message>
+ <source>Login Failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fetching categories error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fetching apps error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>DownloadsStore</name>
<message>
<source>%1 Successfully Installed</source>
- <translation type="unfinished"></translation>
+ <translation>%1 erfolgreich installiert</translation>
</message>
<message>
<source>%1 successfully installed</source>
- <translation type="unfinished"></translation>
+ <translation>%1 erfolgreich installiert</translation>
</message>
<message>
<source>%1 Successfully Uninstalled</source>
- <translation type="unfinished"></translation>
+ <translation>%1 erfolgreich deinstalliert</translation>
</message>
<message>
<source>%1 successfully uninstalled</source>
- <translation type="unfinished"></translation>
+ <translation>%1 erfolgreich deinstalliert</translation>
</message>
<message>
<source>System is not logged in</source>
- <translation type="unfinished"></translation>
+ <translation>Das System ist nicht angemeldet</translation>
</message>
<message>
<source>%1 Download Failed</source>
- <translation type="unfinished"></translation>
+ <translation>%1 Herunterladen ist fehlgeschlagen</translation>
</message>
<message>
<source>%1 download failed</source>
- <translation type="unfinished"></translation>
+ <translation>%1 Herunterladen ist fehlgeschlagen</translation>
</message>
<message>
<source>%1 Uninstallation Failed</source>
- <translation type="unfinished"></translation>
+ <translation>%1 Deinstallation ist fehlgeschlagen</translation>
</message>
<message>
<source>%1 uninstallation failed</source>
- <translation type="unfinished"></translation>
+ <translation>%1 Deinstallation ist fehlgeschlagen</translation>
</message>
<message>
<source>%1 Installation Failed</source>
- <translation type="unfinished"></translation>
+ <translation>%1 Installation ist fehlgeschlagen</translation>
</message>
<message>
<source>%1 installation failed</source>
- <translation type="unfinished"></translation>
+ <translation>%1 Installation ist fehlgeschlagen</translation>
</message>
<message>
<source>%1 Bytes</source>
- <translation type="unfinished"></translation>
+ <translation>%1 Bytes</translation>
</message>
<message>
<source>%1 MB</source>
- <translation type="unfinished"></translation>
+ <translation>%1 MB</translation>
</message>
<message>
<source>%1 GB</source>
- <translation type="unfinished"></translation>
+ <translation>%1 GB</translation>
+ </message>
+ <message>
+ <source>built-in</source>
+ <translation>integriert</translation>
+ </message>
+ <message>
+ <source>Unknown size</source>
+ <translation>Unbekannte Größe</translation>
+ </message>
+ <message>
+ <source>%1 Successfully updated</source>
+ <translation>%1 Aktuakisuerung erfolgreich</translation>
+ </message>
+ <message>
+ <source>%1 successfully updated</source>
+ <translation>%1 Aktualisierung erfolgreich</translation>
+ </message>
+ <message>
+ <source>%1 Updates successfully Uninstalled</source>
+ <translation>%1 Die Updates wurden erfolgreich deinstalliert</translation>
+ </message>
+ <message>
+ <source>%1 updates successfully uninstalled</source>
+ <translation>%1 die Updates wurden erfolgreich deinstalliert</translation>
</message>
</context>
<context>
<name>DownloadsView</name>
<message>
<source>Fetching data from Neptune Server</source>
- <translation type="unfinished"></translation>
+ <translation>Abruf der Daten vom Neptune-Server</translation>
</message>
<message>
<source>Cannot Connect to the Server</source>
- <translation type="unfinished"></translation>
+ <translation>Keine Verbindung mit dem Server</translation>
</message>
<message>
<source>No apps found!</source>
- <translation type="unfinished">Keine Programme gefunden!</translation>
+ <translation type="vanished">Keine Apps gefunden!</translation>
</message>
<message>
<source>A Network connection is required</source>
- <translation type="unfinished"></translation>
+ <translation>Netzwerkverbindung erforderlich</translation>
</message>
<message>
<source>Reconnecting...</source>
- <translation type="unfinished"></translation>
+ <translation>Wiederverbindung...</translation>
</message>
<message>
<source>Retry</source>
+ <translation>Wiederholung</translation>
+ </message>
+ <message>
+ <source>Connecting to server...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Server is not available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Server is on Maintance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No apps</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -496,15 +598,15 @@
<name>DrivingModeRange</name>
<message>
<source>NORMAL</source>
- <translation type="unfinished"></translation>
+ <translation>NORMAL</translation>
</message>
<message>
<source>ECO</source>
- <translation type="unfinished"></translation>
+ <translation>ECO</translation>
</message>
<message>
<source>SPORT</source>
- <translation type="unfinished"></translation>
+ <translation>SPORT</translation>
</message>
</context>
<context>
@@ -518,69 +620,81 @@
<name>EnergyPanel</name>
<message>
<source>Present</source>
- <translation type="unfinished">Jetzt</translation>
+ <translation>Jetzt</translation>
</message>
<message>
<source>1 day</source>
- <translation type="unfinished">1 Tag</translation>
+ <translation>1 Tag</translation>
</message>
<message>
<source>1 week</source>
- <translation type="unfinished">1 Woche</translation>
+ <translation>1 Woche</translation>
</message>
<message>
<source>1 month</source>
- <translation type="unfinished">1 Monat</translation>
+ <translation>1 Monat</translation>
</message>
<message>
<source>Projected distance to empty</source>
- <translation type="unfinished">Kalkulierte Distanz bis leer</translation>
+ <translation>Kalkulierte Distanz bis &quot;&quot;leer&quot;&quot;</translation>
</message>
<message>
<source>184</source>
- <translation type="unfinished">184</translation>
+ <translation>184</translation>
</message>
<message>
<source>km</source>
- <translation type="unfinished">Km</translation>
+ <translation>Km</translation>
</message>
<message>
<source>Charging stations</source>
- <translation type="unfinished">Ladestationen</translation>
+ <translation>Ladestationen</translation>
</message>
<message>
<source>Show on map</source>
- <translation type="unfinished">Zeige auf Karte</translation>
+ <translation type="obsolete">Zeige auf Karte</translation>
</message>
<message>
<source>21</source>
- <translation type="unfinished">21</translation>
+ <translation>21</translation>
</message>
<message>
<source>Donald Weese Ct, Las Vegas</source>
- <translation type="unfinished">Donald Weese Ct, Las Vegas</translation>
+ <translation>Donald Weese Ct, Las Vegas</translation>
</message>
<message>
<source>Route</source>
- <translation type="unfinished">Route</translation>
+ <translation>Route</translation>
</message>
<message>
<source>27</source>
- <translation type="unfinished">27</translation>
+ <translation>27</translation>
</message>
<message>
<source>Faiss Dr, Las Vegas</source>
- <translation type="unfinished"></translation>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Open map</source>
+ <translation>Karte öffnen</translation>
</message>
</context>
<context>
<name>FavDestinationButtonsPanel</name>
<message>
<source>Home</source>
- <translation type="unfinished"></translation>
+ <translation>Zuhause</translation>
</message>
<message>
<source>Work</source>
+ <translation>Arbeit</translation>
+ </message>
+ <message>
+ <source>Welandergatan 29</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Östra Hamngatan 16</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -601,18 +715,19 @@
<message>
<source>more</source>
<comment>more contacts</comment>
- <translation type="unfinished">mehr</translation>
+ <translatorcomment>andere Kontakte</translatorcomment>
+ <translation>mehr</translation>
</message>
</context>
<context>
<name>FrontDoorsPanel</name>
<message>
<source>Close</source>
- <translation type="unfinished">Schliessen</translation>
+ <translation>Schliessen</translation>
</message>
<message>
<source>Open</source>
- <translation type="unfinished">Öffnen</translation>
+ <translation>Öffnen</translation>
</message>
</context>
<context>
@@ -625,23 +740,69 @@
<source>Browse</source>
<translation type="obsolete">Liste</translation>
</message>
+ <message>
+ <source>Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Artist</source>
+ <translation type="unfinished">Artist</translation>
+ </message>
+ <message>
+ <source>Album</source>
+ <translation type="unfinished">Album</translation>
+ </message>
</context>
<context>
<name>FullScreenTopView</name>
<message>
<source>Next</source>
- <translation type="unfinished">Nächster</translation>
+ <translation>Nächster</translation>
</message>
<message>
<source>Browse</source>
- <translation type="unfinished">Liste</translation>
+ <translation>Liste</translation>
</message>
<message>
<source>MANUAL</source>
- <translation type="unfinished"></translation>
+ <translation>MANUELL</translation>
</message>
<message>
<source>BROWSE</source>
+ <translation>DURCHSUCHEN</translation>
+ </message>
+</context>
+<context>
+ <name>HotspotPanel</name>
+ <message>
+ <source>Hotspot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hotspot Enabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SSID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ICMapView</name>
+ <message>
+ <source>km</source>
+ <translation type="obsolete">Km</translation>
+ </message>
+ <message>
+ <source>Next turn: </source>
+ <translation>Nächste Kurve: </translation>
+ </message>
+ <message>
+ <source>The map is disabled in this runtime environment</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -649,7 +810,7 @@
<name>ICMusicView</name>
<message>
<source>Track unavailable</source>
- <translation type="unfinished">Track nicht verfügbar</translation>
+ <translation>Musikstück nicht verfügbar</translation>
</message>
</context>
<context>
@@ -678,19 +839,83 @@
</message>
<message>
<source>km/h</source>
- <translation type="unfinished">Km/h</translation>
+ <translation type="obsolete">Km/h</translation>
</message>
<message>
<source>Your parking period is about to end</source>
- <translation type="unfinished"></translation>
+ <translation>Ihre Parkzeit ist fast abgelaufen</translation>
</message>
<message>
<source>Your parking period will be ended in 5 minutes.
Please extend your parking ticket or move your car.</source>
+ <translation>Ihre Parkzeit läuft in 5 Minuten ab. Verlängern Sie das Parkticket oder fahren Sie das Auto weg.</translation>
+ </message>
+ <message>
+ <source>No active parking tickets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zone
+Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2h, 14 minutes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Every day 12 - 22</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Other times</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Service fee</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1.5 $ / started hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1 $ / started hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1275, Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation type="unfinished">Start</translation>
+ </message>
+ <message>
+ <source>End (2.29 $)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call for support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>, Parking Olympia</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
+ <name>MainView</name>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">Km/h</translation>
+ </message>
+</context>
+<context>
<name>MapHeader</name>
<message>
<source>Where do you wanna go today?</source>
@@ -701,55 +926,55 @@
<name>MapStore</name>
<message numerus="yes">
<source>%n kilometer(s)</source>
- <translation type="unfinished">
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%n Kilometer(n)</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n day(s)</source>
- <translation type="unfinished">
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%n Tag(e)</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
- <translation type="unfinished">
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%n Stunde(n)</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n minute(s)</source>
- <translation type="unfinished">
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%n Minute (n)</numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>Offline mode</source>
- <translation type="unfinished"></translation>
+ <translation>Offline-Modus</translation>
</message>
<message>
<source>Search and navigation are not available in offline mode</source>
- <translation type="unfinished"></translation>
+ <translation>Suche und Navigation im Offline-Modus nicht verfügbar</translation>
</message>
<message>
<source>Offline map</source>
- <translation type="unfinished"></translation>
+ <translation>Offline-Karte</translation>
</message>
<message>
<source>Offline Map only available in Light Theme</source>
- <translation type="unfinished"></translation>
+ <translation>Offline-Karte ist nur im hellen Design aufrufbar</translation>
</message>
<message>
<source>Online map</source>
- <translation type="unfinished"></translation>
+ <translation>Online-Karte</translation>
</message>
<message>
<source>You are now using online map from Mapbox server</source>
- <translation type="unfinished"></translation>
+ <translation>Jetzt benutzen Sie die Online-Karte vom Mapbox-Server</translation>
</message>
</context>
<context>
@@ -758,6 +983,10 @@
<source>Where do you wanna go today?</source>
<translation type="obsolete">Wo soll es heute hingehen?</translation>
</message>
+ <message>
+ <source>The map is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Maps</name>
@@ -778,7 +1007,7 @@
</message>
<message>
<source>FPS: %1</source>
- <translation type="unfinished">FPS: %1</translation>
+ <translation>FPS: %1</translation>
</message>
</context>
<context>
@@ -789,71 +1018,71 @@
</message>
<message>
<source>System Monitor Overlay</source>
- <translation type="unfinished"></translation>
+ <translation>Überlagerung des Leistungsmonitors</translation>
</message>
<message>
<source>Startup timings</source>
- <translation type="unfinished"></translation>
+ <translation>Starttimings</translation>
</message>
<message>
<source>From boot to System UI process start: %1 ms</source>
- <translation type="unfinished"></translation>
+ <translation>Vom Systemstart zum Start der System UI: %1 ms</translation>
</message>
<message>
<source>From System UI process start to first frame drawn: %1 ms</source>
- <translation type="unfinished"></translation>
+ <translation>Vom Start der System UI bis zum ersten Einzelbild: %1 ms</translation>
</message>
<message>
<source>Startup timings not available. Make sure the environment variable AM_STARTUP_TIMER was set</source>
- <translation type="unfinished"></translation>
+ <translation>Starttimings sind nicht verfügbar. Stellen Sie sicher, dass die Umgebungsvariable AM_STARTUP_TIMER gesetzt wurde</translation>
</message>
<message>
<source>Version</source>
- <translation type="unfinished"></translation>
+ <translation>Version</translation>
</message>
<message>
<source>Platform</source>
- <translation type="unfinished"></translation>
+ <translation>Plattform</translation>
</message>
<message>
<source>Qt IVI: %1</source>
- <translation type="unfinished"></translation>
+ <translation>Qt IVI: %1</translation>
</message>
<message>
<source>Neptune 3: %1 %2</source>
- <translation type="unfinished"></translation>
+ <translation>Neptune 3: %1 %2</translation>
</message>
<message>
<source>Mode: </source>
- <translation type="unfinished"></translation>
+ <translation>Modus: </translation>
</message>
<message>
<source>single-process</source>
- <translation type="unfinished"></translation>
+ <translation>Einzelprozess</translation>
</message>
<message>
<source>multi-process</source>
- <translation type="unfinished"></translation>
+ <translation>Multiprozess</translation>
</message>
<message>
<source>Qt Application Manager: %1</source>
- <translation type="unfinished"></translation>
+ <translation>Qt Application Manager: %1</translation>
</message>
<message>
<source>, no internet</source>
- <translation type="unfinished"></translation>
+ <translation>, keine Internetverbindung</translation>
</message>
<message>
<source>Network: %1%2</source>
- <translation type="unfinished"></translation>
+ <translation>Netzwerk: %1%2</translation>
</message>
<message>
<source>connected</source>
- <translation type="unfinished"></translation>
+ <translation>verbunden</translation>
</message>
<message>
<source>disconnected</source>
- <translation type="unfinished"></translation>
+ <translation>unterbrochen</translation>
</message>
</context>
<context>
@@ -882,7 +1111,7 @@
<name>MusicBrowseListPanel</name>
<message>
<source>Play All</source>
- <translation type="unfinished"></translation>
+ <translation>Alles abspielen</translation>
</message>
</context>
<context>
@@ -908,17 +1137,25 @@
<name>MusicSourcesPopup</name>
<message>
<source>Choose Source</source>
- <translation type="unfinished"></translation>
+ <translation>Quelle wählen</translation>
</message>
</context>
<context>
<name>MusicStore</name>
<message>
<source>Unknown Artist</source>
- <translation type="unfinished"></translation>
+ <translation>Unbekannter Artist</translation>
</message>
<message>
<source>Unknown Album</source>
+ <translation>Unbekanntes Album</translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AM/FM Radio</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -946,7 +1183,7 @@
</message>
<message>
<source>sources</source>
- <translation type="unfinished"></translation>
+ <translation>Quellen</translation>
</message>
</context>
<context>
@@ -961,14 +1198,21 @@
</message>
</context>
<context>
+ <name>NaviPanel</name>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">Km/h</translation>
+ </message>
+</context>
+<context>
<name>NavigationConfirmPanel</name>
<message>
<source>Start</source>
- <translation type="unfinished"></translation>
+ <translation>Start</translation>
</message>
<message>
<source>Directions</source>
- <translation type="unfinished"></translation>
+ <translation>Richtungen</translation>
</message>
</context>
<context>
@@ -986,11 +1230,11 @@
</message>
<message>
<source>Search</source>
- <translation type="unfinished"></translation>
+ <translation>Suche</translation>
</message>
<message>
<source>Search not available offline</source>
- <translation type="unfinished"></translation>
+ <translation>Suche ist im Offline-Modus nicht verfügbar</translation>
</message>
<message>
<source>Where do you want to go?</source>
@@ -998,6 +1242,17 @@
</message>
</context>
<context>
+ <name>NavigationStore</name>
+ <message>
+ <source>km</source>
+ <translation>Km</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation>m</translation>
+ </message>
+</context>
+<context>
<name>NetworkMonitor</name>
<message>
<source>Network</source>
@@ -1008,11 +1263,11 @@
<name>NotificationCenter</name>
<message>
<source>No Notifications</source>
- <translation type="unfinished"></translation>
+ <translation>Keine Mitteilungen</translation>
</message>
<message>
<source>Clear list</source>
- <translation type="unfinished"></translation>
+ <translation>Leere Liste</translation>
</message>
</context>
<context>
@@ -1052,72 +1307,92 @@
<name>RamMonitor</name>
<message>
<source>50%</source>
- <translation type="unfinished">50%</translation>
+ <translation>50%</translation>
</message>
<message>
<source>RAM: </source>
- <translation type="unfinished"></translation>
+ <translation>RAM: </translation>
</message>
</context>
<context>
<name>RoofPanel</name>
<message>
<source>Close</source>
- <translation type="unfinished">Schliessen</translation>
+ <translation>Schliessen</translation>
</message>
<message>
<source>Open</source>
- <translation type="unfinished">Öffnen</translation>
+ <translation>Öffnen</translation>
</message>
</context>
<context>
<name>RootStore</name>
<message>
<source>Light</source>
- <translation type="unfinished">Hell</translation>
+ <translation>Hell</translation>
</message>
<message>
<source>Dark</source>
- <translation type="unfinished">Dunkel</translation>
+ <translation>Dunkel</translation>
</message>
<message>
<source>UI screenshot has been taken successfully</source>
- <translation type="unfinished"></translation>
+ <translation>Der UI-Screenshot wurde erfolgreich erstellt</translation>
</message>
<message>
<source>UI screenshot and diagnostics information are stored in %1</source>
- <translation type="unfinished"></translation>
+ <translation>Der UI-Screenshot und Diagnoseninformation sind in %1 gespeichert</translation>
</message>
<message>
<source>km</source>
- <translation type="unfinished">Km</translation>
+ <translation>Km</translation>
</message>
<message>
<source>mi</source>
- <translation type="unfinished"></translation>
+ <translation>mi</translation>
</message>
<message>
<source>km/h</source>
- <translation type="unfinished">Km/h</translation>
+ <translation>Km/h</translation>
</message>
<message>
<source>mph</source>
- <translation type="unfinished"></translation>
+ <translation>mph</translation>
</message>
<message>
<source>°C</source>
- <translation type="unfinished"></translation>
+ <translation>°C</translation>
</message>
<message>
<source>°F</source>
- <translation type="unfinished"></translation>
+ <translation>°F</translation>
</message>
<message>
<source>UI Language changed</source>
- <translation type="unfinished"></translation>
+ <translation>UI-Sprache wurde geändert</translation>
</message>
<message>
<source>UI Language changed into %1 (%2)</source>
+ <translation>UI-Sprache wurde auf %1 (%2) geändert</translation>
+ </message>
+ <message>
+ <source>UI Accent Color changed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Accent Color changed into %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed into Light Theme</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed into Dark Theme</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1125,30 +1400,30 @@
<name>SearchOverlayPanel</name>
<message>
<source>Back</source>
- <translation type="unfinished"></translation>
+ <translation>Zurück</translation>
</message>
</context>
<context>
<name>Settings3DPanel</name>
<message>
<source>Qt 3D Studio</source>
- <translation type="unfinished"></translation>
+ <translation>Qt 3D Studio</translation>
</message>
<message>
<source>Qt 3D Model Quality</source>
- <translation type="unfinished"></translation>
+ <translation>Qualität des Qt 3D Models</translation>
</message>
<message>
<source>Qt 3D</source>
- <translation type="unfinished"></translation>
+ <translation>Qt 3D</translation>
</message>
<message>
<source>3D Runtime</source>
- <translation type="unfinished"></translation>
+ <translation>3D-Laufzeitumgebung</translation>
</message>
<message>
<source>Vehicle App needs to be restarted</source>
- <translation type="unfinished"></translation>
+ <translation>Neustart der Vehicle App erforderlich</translation>
</message>
</context>
<context>
@@ -1257,11 +1532,18 @@
</message>
<message>
<source>colors</source>
- <translation type="unfinished"></translation>
+ <translation>Farben</translation>
</message>
<message>
- <source>connectivity</source>
- <translation type="unfinished"></translation>
+ <source>network</source>
+ <translation>Netzwerk</translation>
+ </message>
+</context>
+<context>
+ <name>SpeedPanel</name>
+ <message>
+ <source>km/h</source>
+ <translation>Km/h</translation>
</message>
</context>
<context>
@@ -1310,64 +1592,72 @@
<name>TiresPanel</name>
<message>
<source>240</source>
- <translation type="unfinished">240</translation>
+ <translation>240</translation>
</message>
<message>
<source>kPa</source>
- <translation type="unfinished">kPa</translation>
+ <translation>kPa</translation>
</message>
<message>
<source>Normal load</source>
- <translation type="unfinished">Normale Ladung</translation>
+ <translation>Normale Ladung</translation>
</message>
<message>
<source>Target: 240 kPa</source>
- <translation type="unfinished">Ziel: 240 kPa</translation>
+ <translation>Ziel: 240 kPa</translation>
</message>
<message>
<source>Max load</source>
- <translation type="unfinished">Max. Ladung</translation>
+ <translation>Max. Ladung</translation>
</message>
<message>
<source>Target: 270 kPa</source>
- <translation type="unfinished">Ziel: 270 kPa</translation>
+ <translation>Ziel: 270 kPa</translation>
</message>
<message>
<source>Calibrate</source>
- <translation type="unfinished">Einstellen</translation>
+ <translation>Kalibrieren</translation>
</message>
</context>
<context>
<name>TrunkPanel</name>
<message>
<source>Close</source>
- <translation type="unfinished">Schliessen</translation>
+ <translation>Schliessen</translation>
</message>
<message>
<source>Open</source>
- <translation type="unfinished">Öffnen</translation>
+ <translation>Öffnen</translation>
</message>
</context>
<context>
<name>TunerStore</name>
<message>
<source>FM1</source>
- <translation type="unfinished"></translation>
+ <translation>FM1</translation>
</message>
<message>
<source>FM2</source>
- <translation type="unfinished"></translation>
+ <translation>FM2</translation>
</message>
<message>
<source>AM</source>
- <translation type="unfinished"></translation>
+ <translation>AM</translation>
</message>
<message>
<source>KHz</source>
- <translation type="unfinished"></translation>
+ <translation>KHz</translation>
</message>
<message>
<source>MHz</source>
+ <translation>MHz</translation>
+ </message>
+ <message>
+ <source>AM/FM Radio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Music</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1375,23 +1665,23 @@
<name>TunerToolsColumn</name>
<message>
<source>favorites</source>
- <translation type="unfinished">Favouriten</translation>
+ <translation>Favouriten</translation>
</message>
<message>
<source>AM band</source>
- <translation type="unfinished"></translation>
+ <translation>AM Band</translation>
</message>
<message>
<source>FM 1 band</source>
- <translation type="unfinished"></translation>
+ <translation>FM1 Band</translation>
</message>
<message>
<source>FM 2 band</source>
- <translation type="unfinished"></translation>
+ <translation>FM 2 Band</translation>
</message>
<message>
<source>sources</source>
- <translation type="unfinished"></translation>
+ <translation>Quellen</translation>
</message>
</context>
<context>
@@ -1523,43 +1813,43 @@
<name>VehicleStore</name>
<message>
<source>Fees</source>
- <translation type="unfinished">Gebühren</translation>
+ <translation>Gebühren</translation>
</message>
<message>
<source>Hill Descent Control</source>
- <translation type="unfinished">Bergabfahrhilfe</translation>
+ <translation>Bergabfahrhilfe</translation>
</message>
<message>
<source>Traffic Jam Assist</source>
- <translation type="unfinished">Stau-Assistent</translation>
+ <translation>Stau-Assistent</translation>
</message>
<message>
<source>Intelligent speed adaptation</source>
- <translation type="unfinished"></translation>
+ <translation>Intelligente Geschw.-anpassung</translation>
</message>
<message>
<source>High</source>
- <translation type="unfinished"></translation>
+ <translation>Hoch</translation>
</message>
<message>
<source>Medium</source>
- <translation type="unfinished"></translation>
+ <translation>Medium</translation>
</message>
<message>
<source>Low</source>
- <translation type="unfinished"></translation>
+ <translation>Niedrig</translation>
</message>
<message>
<source>Qt3D Runtime is requested</source>
- <translation type="unfinished"></translation>
+ <translation>Qt3D-Laufzeitumgebung wird geladen</translation>
</message>
<message>
<source>Qt 3D Studio Runtime is requested</source>
- <translation type="unfinished"></translation>
+ <translation>Qt3D Studio-Laufzeitumgebung wird geladen</translation>
</message>
<message>
<source>Please restart the Vehicle App to use selected runtime</source>
- <translation type="unfinished"></translation>
+ <translation>Bitte starten Sie die Vehicle-App neu, um gewählte Laufzeitumgebung zu verwenden</translation>
</message>
</context>
<context>
@@ -1582,6 +1872,13 @@
</message>
<message>
<source>options</source>
+ <translation>Optionen</translation>
+ </message>
+</context>
+<context>
+ <name>VehicleView</name>
+ <message>
+ <source>The 3D car model is disabled in this runtime environment</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1611,4 +1908,53 @@
<translation type="vanished">Adresseingabe</translation>
</message>
</context>
+<context>
+ <name>WiFiPanel</name>
+ <message>
+ <source>Wi-Fi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wi-Fi Enabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WiFiPopup</name>
+ <message>
+ <source>Input password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Manual connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SSID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WidgetContentView</name>
+ <message>
+ <source>Discover similar music</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
</TS>
diff --git a/imports_shared/assets/translations/en_GB.ts b/imports_shared/assets/translations/en_GB.ts
index 79df5efb..f99618fa 100644
--- a/imports_shared/assets/translations/en_GB.ts
+++ b/imports_shared/assets/translations/en_GB.ts
@@ -117,6 +117,23 @@
</message>
</context>
<context>
+ <name>CalendarMaximizedPanel</name>
+ <message>
+ <source>Partly sunny, 21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Today: Mostly sunny,
+the highest temperature will be 26°.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tonight: Mostly cloudy with light rain,
+temperatures between 14° and 18°.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>CalendarToolsColumn</name>
<message>
<source>year</source>
@@ -137,6 +154,14 @@
<source>Partly cloudy</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Partly sunny, 21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>CenterConsoleMonitorOverlay</name>
@@ -172,6 +197,21 @@
</message>
</context>
<context>
+ <name>ConnectivityPanel</name>
+ <message>
+ <source>Wi-Fi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hotspot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bluetooth</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>CpuMonitor</name>
<message>
<source>CPU: </source>
@@ -231,6 +271,28 @@
</message>
</context>
<context>
+ <name>DownloadAppList</name>
+ <message>
+ <source>update</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DownloadsStates</name>
+ <message>
+ <source>Login Failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fetching categories error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fetching apps error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>DownloadsStore</name>
<message>
<source>%1 Successfully Installed</source>
@@ -288,6 +350,30 @@
<source>%1 GB</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>built-in</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unknown size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 Successfully updated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 successfully updated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 Updates successfully Uninstalled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 updates successfully uninstalled</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DownloadsView</name>
@@ -300,10 +386,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>No apps found!</source>
- <translation></translation>
- </message>
- <message>
<source>A Network connection is required</source>
<translation type="unfinished"></translation>
</message>
@@ -315,6 +397,22 @@
<source>Retry</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Connecting to server...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Server is not available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Server is on Maintance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No apps</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DrivingModeRange</name>
@@ -373,10 +471,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Show on map</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>21</source>
<translation type="unfinished"></translation>
</message>
@@ -396,6 +490,10 @@
<source>Faiss Dr, Las Vegas</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Open map</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FavDestinationButtonsPanel</name>
@@ -407,6 +505,14 @@
<source>Work</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Welandergatan 29</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Östra Hamngatan 16</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FavoritesWidgetView</name>
@@ -428,6 +534,21 @@
</message>
</context>
<context>
+ <name>FullScreenBottomView</name>
+ <message>
+ <source>Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Artist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Album</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>FullScreenTopView</name>
<message>
<source>Next</source>
@@ -447,6 +568,36 @@
</message>
</context>
<context>
+ <name>HotspotPanel</name>
+ <message>
+ <source>Hotspot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hotspot Enabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SSID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ICMapView</name>
+ <message>
+ <source>Next turn: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The map is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>ICMusicView</name>
<message>
<source>Track unavailable</source>
@@ -460,10 +611,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>km/h</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Your parking period is about to end</source>
<translation type="unfinished"></translation>
</message>
@@ -472,6 +619,63 @@
Please extend your parking ticket or move your car.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No active parking tickets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zone
+Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2h, 14 minutes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Every day 12 - 22</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Other times</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Service fee</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1.5 $ / started hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1 $ / started hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1275, Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>End (2.29 $)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call for support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>, Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>MapRouting</name>
@@ -560,6 +764,13 @@
</message>
</context>
<context>
+ <name>MapView</name>
+ <message>
+ <source>The map is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>MonitorOverlay</name>
<message>
<source>FPS: %1</source>
@@ -668,6 +879,14 @@
<source>Unknown Album</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Music</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AM/FM Radio</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>MusicToolsColumn</name>
@@ -715,6 +934,17 @@
</message>
</context>
<context>
+ <name>NavigationStore</name>
+ <message>
+ <source>km</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>NotificationCenter</name>
<message>
<source>No Notifications</source>
@@ -823,6 +1053,26 @@
<source>Dark</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>UI Accent Color changed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Accent Color changed into %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed into Light Theme</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed into Dark Theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>SearchOverlayPanel</name>
@@ -908,7 +1158,14 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>connectivity</source>
+ <source>network</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SpeedPanel</name>
+ <message>
+ <source>km/h</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -976,6 +1233,14 @@
<source>MHz</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>AM/FM Radio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TunerToolsColumn</name>
@@ -1085,6 +1350,13 @@
</message>
</context>
<context>
+ <name>VehicleView</name>
+ <message>
+ <source>The 3D car model is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>VehicleWidgetModel</name>
<message>
<source>Hill Descent Control</source>
@@ -1095,4 +1367,53 @@
<translation type="obsolete">Traffic Jam Assist</translation>
</message>
</context>
+<context>
+ <name>WiFiPanel</name>
+ <message>
+ <source>Wi-Fi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wi-Fi Enabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WiFiPopup</name>
+ <message>
+ <source>Input password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Manual connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SSID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WidgetContentView</name>
+ <message>
+ <source>Discover similar music</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
</TS>
diff --git a/imports_shared/assets/translations/en_US.ts b/imports_shared/assets/translations/en_US.ts
index d6ec9f3f..1d4d440e 100644
--- a/imports_shared/assets/translations/en_US.ts
+++ b/imports_shared/assets/translations/en_US.ts
@@ -117,6 +117,23 @@
</message>
</context>
<context>
+ <name>CalendarMaximizedPanel</name>
+ <message>
+ <source>Partly sunny, 21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Today: Mostly sunny,
+the highest temperature will be 26°.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tonight: Mostly cloudy with light rain,
+temperatures between 14° and 18°.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>CalendarToolsColumn</name>
<message>
<source>year</source>
@@ -137,6 +154,14 @@
<source>Partly cloudy</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Partly sunny, 21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>CenterConsoleMonitorOverlay</name>
@@ -172,6 +197,21 @@
</message>
</context>
<context>
+ <name>ConnectivityPanel</name>
+ <message>
+ <source>Wi-Fi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hotspot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bluetooth</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>CpuMonitor</name>
<message>
<source>CPU: </source>
@@ -231,6 +271,28 @@
</message>
</context>
<context>
+ <name>DownloadAppList</name>
+ <message>
+ <source>update</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DownloadsStates</name>
+ <message>
+ <source>Login Failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fetching categories error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fetching apps error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>DownloadsStore</name>
<message>
<source>%1 Successfully Installed</source>
@@ -288,6 +350,30 @@
<source>%1 GB</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>built-in</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unknown size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 Successfully updated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 successfully updated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 Updates successfully Uninstalled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 updates successfully uninstalled</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DownloadsView</name>
@@ -300,10 +386,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>No apps found!</source>
- <translation></translation>
- </message>
- <message>
<source>A Network connection is required</source>
<translation type="unfinished"></translation>
</message>
@@ -315,6 +397,22 @@
<source>Retry</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Connecting to server...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Server is not available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Server is on Maintance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No apps</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DrivingModeRange</name>
@@ -373,10 +471,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Show on map</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>21</source>
<translation type="unfinished"></translation>
</message>
@@ -396,6 +490,10 @@
<source>Faiss Dr, Las Vegas</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Open map</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FavDestinationButtonsPanel</name>
@@ -407,6 +505,14 @@
<source>Work</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Welandergatan 29</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Östra Hamngatan 16</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FavoritesWidgetView</name>
@@ -428,6 +534,21 @@
</message>
</context>
<context>
+ <name>FullScreenBottomView</name>
+ <message>
+ <source>Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Artist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Album</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>FullScreenTopView</name>
<message>
<source>Next</source>
@@ -447,6 +568,36 @@
</message>
</context>
<context>
+ <name>HotspotPanel</name>
+ <message>
+ <source>Hotspot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hotspot Enabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SSID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ICMapView</name>
+ <message>
+ <source>Next turn: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The map is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>ICMusicView</name>
<message>
<source>Track unavailable</source>
@@ -460,10 +611,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>km/h</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Your parking period is about to end</source>
<translation type="unfinished"></translation>
</message>
@@ -472,6 +619,63 @@
Please extend your parking ticket or move your car.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No active parking tickets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zone
+Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2h, 14 minutes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Every day 12 - 22</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Other times</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Service fee</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1.5 $ / started hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1 $ / started hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1275, Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>End (2.29 $)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call for support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>, Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>MapRouting</name>
@@ -560,6 +764,13 @@
</message>
</context>
<context>
+ <name>MapView</name>
+ <message>
+ <source>The map is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>MonitorOverlay</name>
<message>
<source>FPS: %1</source>
@@ -661,6 +872,14 @@
<source>Unknown Album</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Music</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AM/FM Radio</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>MusicToolsColumn</name>
@@ -708,6 +927,17 @@
</message>
</context>
<context>
+ <name>NavigationStore</name>
+ <message>
+ <source>km</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>NotificationCenter</name>
<message>
<source>No Notifications</source>
@@ -816,6 +1046,26 @@
<source>Dark</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>UI Accent Color changed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Accent Color changed into %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed into Light Theme</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed into Dark Theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>SearchOverlayPanel</name>
@@ -866,7 +1116,14 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>connectivity</source>
+ <source>network</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SpeedPanel</name>
+ <message>
+ <source>km/h</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -934,6 +1191,14 @@
<source>MHz</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>AM/FM Radio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TunerToolsColumn</name>
@@ -1024,4 +1289,60 @@
<translation type="unfinished"></translation>
</message>
</context>
+<context>
+ <name>VehicleView</name>
+ <message>
+ <source>The 3D car model is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WiFiPanel</name>
+ <message>
+ <source>Wi-Fi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wi-Fi Enabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WiFiPopup</name>
+ <message>
+ <source>Input password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Manual connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SSID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WidgetContentView</name>
+ <message>
+ <source>Discover similar music</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
</TS>
diff --git a/imports_shared/assets/translations/ja_JP.ts b/imports_shared/assets/translations/ja_JP.ts
index a36cf437..41157eb4 100644
--- a/imports_shared/assets/translations/ja_JP.ts
+++ b/imports_shared/assets/translations/ja_JP.ts
@@ -157,6 +157,23 @@
</message>
</context>
<context>
+ <name>CalendarMaximizedPanel</name>
+ <message>
+ <source>Partly sunny, 21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Today: Mostly sunny,
+the highest temperature will be 26°.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tonight: Mostly cloudy with light rain,
+temperatures between 14° and 18°.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>CalendarToolsColumn</name>
<message>
<source>year</source>
@@ -212,6 +229,14 @@
<source>Partly cloudy</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Partly sunny, 21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>CalendarWidgetView</name>
@@ -304,6 +329,21 @@
</message>
</context>
<context>
+ <name>ConnectivityPanel</name>
+ <message>
+ <source>Wi-Fi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hotspot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bluetooth</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>CpuMonitor</name>
<message>
<source>CPU: </source>
@@ -393,6 +433,28 @@
</message>
</context>
<context>
+ <name>DownloadAppList</name>
+ <message>
+ <source>update</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DownloadsStates</name>
+ <message>
+ <source>Login Failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fetching categories error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fetching apps error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>DownloadsStore</name>
<message>
<source>%1 Successfully Installed</source>
@@ -450,6 +512,30 @@
<source>%1 GB</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>built-in</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unknown size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 Successfully updated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 successfully updated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 Updates successfully Uninstalled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 updates successfully uninstalled</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DownloadsView</name>
@@ -463,7 +549,7 @@
</message>
<message>
<source>No apps found!</source>
- <translation type="unfinished">アプリが見つかりません!</translation>
+ <translation type="obsolete">アプリが見つかりません!</translation>
</message>
<message>
<source>A Network connection is required</source>
@@ -477,6 +563,22 @@
<source>Retry</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Connecting to server...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Server is not available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Server is on Maintance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No apps</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DrivingModeRange</name>
@@ -536,7 +638,7 @@
</message>
<message>
<source>Show on map</source>
- <translation>地図上に表示する</translation>
+ <translation type="vanished">地図上に表示する</translation>
</message>
<message>
<source>21</source>
@@ -558,6 +660,10 @@
<source>Faiss Dr, Las Vegas</source>
<translation>Faiss Dr, Las Vegas</translation>
</message>
+ <message>
+ <source>Open map</source>
+ <translation>マップを開く</translation>
+ </message>
</context>
<context>
<name>FavDestinationButtonsPanel</name>
@@ -569,6 +675,14 @@
<source>Work</source>
<translation type="unfinished">作業</translation>
</message>
+ <message>
+ <source>Welandergatan 29</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Östra Hamngatan 16</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FavoriteDestinationButtons</name>
@@ -622,6 +736,18 @@
<source>Browse</source>
<translation type="obsolete">ブラウズ</translation>
</message>
+ <message>
+ <source>Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Artist</source>
+ <translation type="unfinished">アーティスト</translation>
+ </message>
+ <message>
+ <source>Album</source>
+ <translation type="unfinished">アルバム</translation>
+ </message>
</context>
<context>
<name>FullScreenTopView</name>
@@ -643,6 +769,40 @@
</message>
</context>
<context>
+ <name>HotspotPanel</name>
+ <message>
+ <source>Hotspot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hotspot Enabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SSID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ICMapView</name>
+ <message>
+ <source>km</source>
+ <translation type="obsolete">km</translation>
+ </message>
+ <message>
+ <source>Next turn: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The map is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>ICMusicView</name>
<message>
<source>Track unavailable</source>
@@ -698,7 +858,7 @@
</message>
<message>
<source>km/h</source>
- <translation type="unfinished">km/h</translation>
+ <translation type="obsolete">km/h</translation>
</message>
<message>
<source>Your parking period is about to end</source>
@@ -709,6 +869,70 @@
Please extend your parking ticket or move your car.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No active parking tickets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zone
+Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2h, 14 minutes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Every day 12 - 22</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Other times</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Service fee</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1.5 $ / started hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1 $ / started hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1275, Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>End (2.29 $)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call for support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>, Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MainView</name>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">km/h</translation>
+ </message>
</context>
<context>
<name>MapHeader</name>
@@ -801,6 +1025,10 @@
<source>Where do you wanna go today?</source>
<translation type="obsolete">あなたはヒンジを握っていますか?</translation>
</message>
+ <message>
+ <source>The map is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Maps</name>
@@ -1006,6 +1234,14 @@
<source>Unknown Album</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Music</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AM/FM Radio</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>MusicToolsColumn</name>
@@ -1046,6 +1282,13 @@
</message>
</context>
<context>
+ <name>NaviPanel</name>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">km/h</translation>
+ </message>
+</context>
+<context>
<name>NavigationConfirm</name>
<message>
<source>Start Navigation</source>
@@ -1098,6 +1341,17 @@
</message>
</context>
<context>
+ <name>NavigationStore</name>
+ <message>
+ <source>km</source>
+ <translation type="unfinished">km</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>NetworkMonitor</name>
<message>
<source>Network</source>
@@ -1262,6 +1516,26 @@
<source>UI Language changed into %1 (%2)</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>UI Accent Color changed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Accent Color changed into %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed into Light Theme</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed into Dark Theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>SearchOverlayPanel</name>
@@ -1402,11 +1676,18 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>connectivity</source>
+ <source>network</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
+ <name>SpeedPanel</name>
+ <message>
+ <source>km/h</source>
+ <translation type="unfinished">km/h</translation>
+ </message>
+</context>
+<context>
<name>StatusBar</name>
<message>
<source>FPS: %1</source>
@@ -1539,6 +1820,14 @@
<source>MHz</source>
<translation type="unfinished">MHz</translation>
</message>
+ <message>
+ <source>AM/FM Radio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TunerToolsColumn</name>
@@ -1783,6 +2072,13 @@
</message>
</context>
<context>
+ <name>VehicleView</name>
+ <message>
+ <source>The 3D car model is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>VehicleWidgetModel</name>
<message>
<source>Fees</source>
@@ -1808,4 +2104,53 @@
<translation type="vanished">アドレスを入力してください</translation>
</message>
</context>
+<context>
+ <name>WiFiPanel</name>
+ <message>
+ <source>Wi-Fi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wi-Fi Enabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WiFiPopup</name>
+ <message>
+ <source>Input password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Manual connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SSID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WidgetContentView</name>
+ <message>
+ <source>Discover similar music</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
</TS>
diff --git a/imports_shared/assets/translations/ko_KR.ts b/imports_shared/assets/translations/ko_KR.ts
index 47dd6be5..60ca0103 100644
--- a/imports_shared/assets/translations/ko_KR.ts
+++ b/imports_shared/assets/translations/ko_KR.ts
@@ -164,6 +164,23 @@
</message>
</context>
<context>
+ <name>CalendarMaximizedPanel</name>
+ <message>
+ <source>Partly sunny, 21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Today: Mostly sunny,
+the highest temperature will be 26°.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tonight: Mostly cloudy with light rain,
+temperatures between 14° and 18°.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>CalendarToolsColumn</name>
<message>
<source>year</source>
@@ -219,6 +236,14 @@
<source>Partly cloudy</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Partly sunny, 21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>CalendarWidgetView</name>
@@ -311,6 +336,21 @@
</message>
</context>
<context>
+ <name>ConnectivityPanel</name>
+ <message>
+ <source>Wi-Fi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hotspot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bluetooth</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>CpuMonitor</name>
<message>
<source>CPU: </source>
@@ -400,6 +440,28 @@
</message>
</context>
<context>
+ <name>DownloadAppList</name>
+ <message>
+ <source>update</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DownloadsStates</name>
+ <message>
+ <source>Login Failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fetching categories error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fetching apps error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>DownloadsStore</name>
<message>
<source>%1 Successfully Installed</source>
@@ -457,6 +519,30 @@
<source>%1 GB</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>built-in</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unknown size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 Successfully updated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 successfully updated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 Updates successfully Uninstalled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 updates successfully uninstalled</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DownloadsView</name>
@@ -470,7 +556,7 @@
</message>
<message>
<source>No apps found!</source>
- <translation type="unfinished">앱을 찾을 수 없습니다!</translation>
+ <translation type="obsolete">앱을 찾을 수 없습니다!</translation>
</message>
<message>
<source>A Network connection is required</source>
@@ -484,6 +570,22 @@
<source>Retry</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Connecting to server...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Server is not available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Server is on Maintance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No apps</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DrivingModeRange</name>
@@ -543,7 +645,7 @@
</message>
<message>
<source>Show on map</source>
- <translation>지도에 표시</translation>
+ <translation type="vanished">지도에 표시</translation>
</message>
<message>
<source>21</source>
@@ -565,6 +667,10 @@
<source>Faiss Dr, Las Vegas</source>
<translation>Faiss Dr, Las Vegas</translation>
</message>
+ <message>
+ <source>Open map</source>
+ <translation>지도 열기</translation>
+ </message>
</context>
<context>
<name>FavDestinationButtonsPanel</name>
@@ -576,6 +682,14 @@
<source>Work</source>
<translation type="unfinished">작업</translation>
</message>
+ <message>
+ <source>Welandergatan 29</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Östra Hamngatan 16</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FavoriteDestinationButtons</name>
@@ -629,6 +743,18 @@
<source>Browse</source>
<translation type="obsolete">파일 탐색</translation>
</message>
+ <message>
+ <source>Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Artist</source>
+ <translation type="unfinished">아티스트</translation>
+ </message>
+ <message>
+ <source>Album</source>
+ <translation type="unfinished">앨범</translation>
+ </message>
</context>
<context>
<name>FullScreenTopView</name>
@@ -650,6 +776,40 @@
</message>
</context>
<context>
+ <name>HotspotPanel</name>
+ <message>
+ <source>Hotspot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hotspot Enabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SSID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ICMapView</name>
+ <message>
+ <source>km</source>
+ <translation type="obsolete">km</translation>
+ </message>
+ <message>
+ <source>Next turn: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The map is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>ICMusicView</name>
<message>
<source>Track unavailable</source>
@@ -705,7 +865,7 @@
</message>
<message>
<source>km/h</source>
- <translation type="unfinished">km/h</translation>
+ <translation type="obsolete">km/h</translation>
</message>
<message>
<source>Your parking period is about to end</source>
@@ -716,6 +876,70 @@
Please extend your parking ticket or move your car.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No active parking tickets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zone
+Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2h, 14 minutes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Every day 12 - 22</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Other times</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Service fee</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1.5 $ / started hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1 $ / started hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1275, Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>End (2.29 $)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call for support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>, Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MainView</name>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">km/h</translation>
+ </message>
</context>
<context>
<name>MapHeader</name>
@@ -808,6 +1032,10 @@
<source>Where do you wanna go today?</source>
<translation type="obsolete">힌트 힌지를 해결 하시겠습니까?</translation>
</message>
+ <message>
+ <source>The map is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Maps</name>
@@ -1013,6 +1241,14 @@
<source>Unknown Album</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Music</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AM/FM Radio</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>MusicToolsColumn</name>
@@ -1053,6 +1289,13 @@
</message>
</context>
<context>
+ <name>NaviPanel</name>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">km/h</translation>
+ </message>
+</context>
+<context>
<name>NavigationConfirm</name>
<message>
<source>Start Navigation</source>
@@ -1105,6 +1348,17 @@
</message>
</context>
<context>
+ <name>NavigationStore</name>
+ <message>
+ <source>km</source>
+ <translation type="unfinished">km</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>NetworkMonitor</name>
<message>
<source>Network</source>
@@ -1269,6 +1523,26 @@
<source>UI Language changed into %1 (%2)</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>UI Accent Color changed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Accent Color changed into %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed into Light Theme</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed into Dark Theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>SearchOverlayPanel</name>
@@ -1421,11 +1695,18 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>connectivity</source>
+ <source>network</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
+ <name>SpeedPanel</name>
+ <message>
+ <source>km/h</source>
+ <translation type="unfinished">km/h</translation>
+ </message>
+</context>
+<context>
<name>StatusBar</name>
<message>
<source>FPS: %1</source>
@@ -1558,6 +1839,14 @@
<source>MHz</source>
<translation type="unfinished">MHz</translation>
</message>
+ <message>
+ <source>AM/FM Radio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TunerToolsColumn</name>
@@ -1802,6 +2091,13 @@
</message>
</context>
<context>
+ <name>VehicleView</name>
+ <message>
+ <source>The 3D car model is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>VehicleWidgetModel</name>
<message>
<source>Fees</source>
@@ -1827,4 +2123,53 @@
<translation type="vanished">주소를 입력하세요</translation>
</message>
</context>
+<context>
+ <name>WiFiPanel</name>
+ <message>
+ <source>Wi-Fi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wi-Fi Enabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WiFiPopup</name>
+ <message>
+ <source>Input password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Manual connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SSID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WidgetContentView</name>
+ <message>
+ <source>Discover similar music</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
</TS>
diff --git a/imports_shared/assets/translations/zh_CN.ts b/imports_shared/assets/translations/zh_CN.ts
index 61f95759..409979df 100644
--- a/imports_shared/assets/translations/zh_CN.ts
+++ b/imports_shared/assets/translations/zh_CN.ts
@@ -164,6 +164,23 @@
</message>
</context>
<context>
+ <name>CalendarMaximizedPanel</name>
+ <message>
+ <source>Partly sunny, 21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Today: Mostly sunny,
+the highest temperature will be 26°.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tonight: Mostly cloudy with light rain,
+temperatures between 14° and 18°.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>CalendarToolsColumn</name>
<message>
<source>year</source>
@@ -219,6 +236,14 @@
<source>Partly cloudy</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Partly sunny, 21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>21°C</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>CalendarWidgetView</name>
@@ -311,6 +336,21 @@
</message>
</context>
<context>
+ <name>ConnectivityPanel</name>
+ <message>
+ <source>Wi-Fi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hotspot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bluetooth</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>CpuMonitor</name>
<message>
<source>CPU: </source>
@@ -400,6 +440,28 @@
</message>
</context>
<context>
+ <name>DownloadAppList</name>
+ <message>
+ <source>update</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DownloadsStates</name>
+ <message>
+ <source>Login Failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fetching categories error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fetching apps error</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>DownloadsStore</name>
<message>
<source>%1 Successfully Installed</source>
@@ -457,6 +519,30 @@
<source>%1 GB</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>built-in</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unknown size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 Successfully updated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 successfully updated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 Updates successfully Uninstalled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 updates successfully uninstalled</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DownloadsView</name>
@@ -470,7 +556,7 @@
</message>
<message>
<source>No apps found!</source>
- <translation type="unfinished">未找到app!</translation>
+ <translation type="obsolete">未找到app!</translation>
</message>
<message>
<source>A Network connection is required</source>
@@ -484,6 +570,22 @@
<source>Retry</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Connecting to server...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Server is not available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Server is on Maintance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No apps</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>DrivingModeRange</name>
@@ -543,7 +645,7 @@
</message>
<message>
<source>Show on map</source>
- <translation>在地图上显示</translation>
+ <translation type="vanished">在地图上显示</translation>
</message>
<message>
<source>21</source>
@@ -565,6 +667,10 @@
<source>Faiss Dr, Las Vegas</source>
<translation>Faiss Dr, 拉斯维加斯</translation>
</message>
+ <message>
+ <source>Open map</source>
+ <translation>打开地图</translation>
+ </message>
</context>
<context>
<name>FavDestinationButtonsPanel</name>
@@ -576,6 +682,14 @@
<source>Work</source>
<translation type="unfinished">工作</translation>
</message>
+ <message>
+ <source>Welandergatan 29</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Östra Hamngatan 16</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FavoriteDestinationButtons</name>
@@ -644,6 +758,18 @@
<source>Browse</source>
<translation type="obsolete">浏览</translation>
</message>
+ <message>
+ <source>Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Artist</source>
+ <translation type="unfinished">歌手</translation>
+ </message>
+ <message>
+ <source>Album</source>
+ <translation type="unfinished">专辑</translation>
+ </message>
</context>
<context>
<name>FullScreenTopView</name>
@@ -665,6 +791,40 @@
</message>
</context>
<context>
+ <name>HotspotPanel</name>
+ <message>
+ <source>Hotspot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hotspot Enabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SSID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ICMapView</name>
+ <message>
+ <source>km</source>
+ <translation type="obsolete">km</translation>
+ </message>
+ <message>
+ <source>Next turn: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The map is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>ICMusicView</name>
<message>
<source>Track unavailable</source>
@@ -726,7 +886,7 @@ If it is wrong, you can just delete first two charactor, just ues &quot;源&quot
</message>
<message>
<source>km/h</source>
- <translation type="unfinished">km/h</translation>
+ <translation type="obsolete">km/h</translation>
</message>
<message>
<source>Your parking period is about to end</source>
@@ -737,6 +897,70 @@ If it is wrong, you can just delete first two charactor, just ues &quot;源&quot
Please extend your parking ticket or move your car.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>No active parking tickets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zone
+Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2h, 14 minutes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Every day 12 - 22</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Other times</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Service fee</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1.5 $ / started hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1 $ / started hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1275, Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>End (2.29 $)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call for support</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>, Parking Olympia</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MainView</name>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">km/h</translation>
+ </message>
</context>
<context>
<name>MapHeader</name>
@@ -829,6 +1053,10 @@ If it is wrong, you can just delete first two charactor, just ues &quot;源&quot
<source>Where do you wanna go today?</source>
<translation type="obsolete">今天你想要去哪儿?</translation>
</message>
+ <message>
+ <source>The map is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Maps</name>
@@ -1041,6 +1269,14 @@ If it is wrong, you can just delete first two charactor, just ues &quot;源&quot
<source>Unknown Album</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Music</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AM/FM Radio</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>MusicToolsColumn</name>
@@ -1081,6 +1317,13 @@ If it is wrong, you can just delete first two charactor, just ues &quot;源&quot
</message>
</context>
<context>
+ <name>NaviPanel</name>
+ <message>
+ <source>km/h</source>
+ <translation type="obsolete">km/h</translation>
+ </message>
+</context>
+<context>
<name>NavigationConfirm</name>
<message>
<source>Start Navigation</source>
@@ -1133,6 +1376,17 @@ If it is wrong, you can just delete first two charactor, just ues &quot;源&quot
</message>
</context>
<context>
+ <name>NavigationStore</name>
+ <message>
+ <source>km</source>
+ <translation type="unfinished">km</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>NetworkMonitor</name>
<message>
<source>Network</source>
@@ -1312,6 +1566,26 @@ If it is wrong, you can just delete first two charactor, just ues &quot;源&quot
<source>UI Language changed into %1 (%2)</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>UI Accent Color changed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Accent Color changed into %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed into Light Theme</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UI Theme changed into Dark Theme</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>SearchOverlayPanel</name>
@@ -1465,11 +1739,18 @@ If it is wrong, you can just delete first two charactor, just ues &quot;源&quot
<translation type="unfinished"></translation>
</message>
<message>
- <source>connectivity</source>
+ <source>network</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
+ <name>SpeedPanel</name>
+ <message>
+ <source>km/h</source>
+ <translation type="unfinished">km/h</translation>
+ </message>
+</context>
+<context>
<name>StatusBar</name>
<message>
<source>FPS: %1</source>
@@ -1631,6 +1912,14 @@ If it is wrong, you can just delete first two charactor, just ues &quot;源&quot
<source>MHz</source>
<translation type="unfinished">MHz</translation>
</message>
+ <message>
+ <source>AM/FM Radio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Music</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TunerToolsColumn</name>
@@ -1875,6 +2164,13 @@ If it is wrong, you can just delete first two charactor, just ues &quot;源&quot
</message>
</context>
<context>
+ <name>VehicleView</name>
+ <message>
+ <source>The 3D car model is disabled in this runtime environment</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>VehicleWidgetModel</name>
<message>
<source>Fees</source>
@@ -1900,4 +2196,53 @@ If it is wrong, you can just delete first two charactor, just ues &quot;源&quot
<translation type="vanished">输入地址</translation>
</message>
</context>
+<context>
+ <name>WiFiPanel</name>
+ <message>
+ <source>Wi-Fi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wi-Fi Enabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disconnect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connected</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WiFiPopup</name>
+ <message>
+ <source>Input password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Manual connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SSID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WidgetContentView</name>
+ <message>
+ <source>Discover similar music</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
</TS>
diff --git a/imports_shared/shared/QtQuick/VirtualKeyboard/Styles/neptune/style.qml b/imports_shared/shared/QtQuick/VirtualKeyboard/Styles/neptune/style.qml
index cbe67dfc..a9c6c0cb 100644
--- a/imports_shared/shared/QtQuick/VirtualKeyboard/Styles/neptune/style.qml
+++ b/imports_shared/shared/QtQuick/VirtualKeyboard/Styles/neptune/style.qml
@@ -40,7 +40,7 @@ import shared.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: "Open Sans"
+ readonly property string fontFamily: "DejaVu Sans"
readonly property real keyBackgroundMargin: Math.round(13 * scaleHint)
readonly property real keyContentMargin: Math.round(45 * scaleHint)
readonly property real keyIconScale: scaleHint * 0.6
diff --git a/imports_shared/shared/utils/Config.qml b/imports_shared/shared/utils/Config.qml
index 08414b40..a7d44340 100644
--- a/imports_shared/shared/utils/Config.qml
+++ b/imports_shared/shared/utils/Config.qml
@@ -70,6 +70,7 @@ QtObject {
}
root.cursorLoaderSource = cursorLoader.source;
}
+ property int cursorAngleOffset: 0
property string cursorLoaderSource: ""
//"Guinea pig" loader.This is to prevent the endless warnings for
//CursorNavigation plugin not installed when this is not available. Here is
diff --git a/imports_shared/shared/utils/Cursor.qml b/imports_shared/shared/utils/Cursor.qml
index 4e5bac54..0ebdd397 100644
--- a/imports_shared/shared/utils/Cursor.qml
+++ b/imports_shared/shared/utils/Cursor.qml
@@ -49,10 +49,12 @@
****************************************************************************/
import QtQuick 2.13
+import QtQml 2.14
import shared.utils 1.0
Loader {
id: root
+
anchors.fill: parent
source: Config.cursorLoaderSource
@@ -63,17 +65,33 @@ Loader {
signal activated()
signal pressAndHold()
- Binding { target: item; property:"parent"; value: root.parent; when: item }
- Binding { target: item; property:"trapsCursor"; value: root.trapsCursor; when: item }
- Binding { target: item; property:"acceptsCursor"; value: root.acceptsCursor; when: item }
- Binding { target: root; property:"hasCursor"; value: item.hasCursor; when: item}
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: item; property:"parent"; value: root.parent; when: item;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: item; property:"trapsCursor"; value: root.trapsCursor; when: item;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: item; property:"acceptsCursor"; value: root.acceptsCursor; when: item;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: item; property:"angleOffset"; value: Config.cursorAngleOffset; when: item;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: root; property:"hasCursor"; value: item.hasCursor; when: item;
+ }
Connections {
target: item
- onActivated: {
+ function onActivated() {
root.activated();
}
- onPressAndHold: {
+ function onPressAndHold() {
root.pressAndHold();
}
}
diff --git a/imports_shared/shared/utils/CursorManagement.qml b/imports_shared/shared/utils/CursorManagement.qml
index a1920787..ea0a2b01 100644
--- a/imports_shared/shared/utils/CursorManagement.qml
+++ b/imports_shared/shared/utils/CursorManagement.qml
@@ -66,10 +66,12 @@ Item {
property bool acceptsCursor: true
property bool hasCursor: parent.CursorNavigation.hasCursor
property bool pressed: false
+ property int angleOffset: 0
signal activated()
signal pressAndHold()
+ CursorNavigation.angleOffset: root.angleOffset
CursorNavigation.acceptsCursor: root.acceptsCursor
CursorNavigation.trapsCursor: root.trapsCursor
CursorNavigation.onActivated: {
@@ -78,10 +80,10 @@ Item {
Connections {
target: (parent.pressed !== undefined) ? parent : null
- onPressed: {
+ function onPressed() {
pressAndHoldSim.start();
}
- onPressedChanged: {
+ function onPressedChanged() {
root.pressed = parent.pressed;
}
}
diff --git a/imports_shared/shared/utils/CursorManagementDummy.qml b/imports_shared/shared/utils/CursorManagementDummy.qml
index 85f4375a..361fa5cc 100644
--- a/imports_shared/shared/utils/CursorManagementDummy.qml
+++ b/imports_shared/shared/utils/CursorManagementDummy.qml
@@ -57,6 +57,7 @@ Item {
property bool hasCursor: false
property bool trapsCursor: false
property bool acceptsCursor: true
+ property int angleOffset: 0
signal activated()
signal pressAndHold()
diff --git a/imports_shared/shared/utils/TouchPointsTracer.qml b/imports_shared/shared/utils/TouchPointsTracer.qml
new file mode 100644
index 00000000..23af2d04
--- /dev/null
+++ b/imports_shared/shared/utils/TouchPointsTracer.qml
@@ -0,0 +1,156 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.13
+import QtQuick.Controls 2.2
+
+import shared.Style 1.0
+import shared.Sizes 1.0
+import shared.com.luxoft.eventslisteners 1.0
+
+
+/*!
+ \qmltype TouchPointsTracer
+ \inqmlmodule utils
+ \inherits Item
+ \since 5.13
+ \brief The mouse/touches tracer for Neptune 3 UI.
+
+ The tracer is used to visualize touch points to help developers see if a touch-device
+ was configured correctly.
+ To enable this object, set the \c SHOW_TOUCH_POINTS environment variable to \c yes.
+
+ The code snippet below shows how to use \l{TouchPointsTracer}:
+
+ \qml
+ import QtQuick 2.10
+ import shared.utils 1.0
+
+ Window {
+ id: root
+
+ width: 80
+ height: 80
+
+ TouchPointsTracer {
+ id: eventsListener
+ target: root
+ }
+ }
+ \endqml
+*/
+
+Item {
+ id: root
+ /*!
+ \qmlproperty var TouchPointsTracer::target
+
+ This property contains the object that was added for event listening.
+ If the target is changed, the previous one is unsubscribed.
+ */
+ property var target: null
+ /*!
+ \qmlproperty bool TouchPointsTracer::showCoords
+
+ This property controls whether coordinates of touch visible or not.
+ */
+ property bool showCoords: false
+
+ onTargetChanged: TouchPointsTracer.target = target
+
+ TouchPointsTracer.onTouchPointsChanged: {
+ for (var i=0; i < points.length; i+=2) {
+ var rec = repeater.itemAt(i / 2);
+ rec.x = points[i]
+ rec.y = points[i + 1]
+ rec.restartAnimation();
+ }
+ }
+
+ Repeater {
+ id: repeater
+ model: 10
+ Item {
+ id: _item
+ visible: false
+ width: Sizes.dp(100)
+ height: width
+
+ function restartAnimation() {
+ recAnimation.restart();
+ }
+
+ Rectangle {
+ id: _rec
+ width: parent.width
+ height: parent.height
+ radius: width/2
+ x: -width/2
+ y: -width/2
+ color: "transparent"
+ border.color: Style.accentColor
+ border.width: Sizes.dp(5)
+
+
+ Rectangle {
+ anchors.centerIn: parent
+ width: parent.width * 0.7
+ height: width
+ radius: width/2
+ opacity: 0.5
+ color: Style.accentColor
+ }
+
+ Rectangle {
+ anchors.centerIn: parent
+ width: Sizes.dp(10)
+ height: width
+ radius: width/2
+ color: Style.accentColor
+ }
+
+ SequentialAnimation {
+ id: recAnimation
+ ScriptAction { script: _item.visible = true; }
+ PauseAnimation { duration: 300 }
+ ScriptAction { script: _item.visible = false; }
+ }
+ }
+
+ Label {
+ visible: root.showCoords
+ anchors.horizontalCenter: _rec.horizontalCenter
+ anchors.bottom: _rec.top
+ text: _item.x + ", " + _item.y
+ }
+ }
+ }
+}
diff --git a/imports_shared/shared/utils/qmldir b/imports_shared/shared/utils/qmldir
index 04854a81..99e73928 100644
--- a/imports_shared/shared/utils/qmldir
+++ b/imports_shared/shared/utils/qmldir
@@ -4,4 +4,5 @@ StageLoader 1.0 StageLoader.qml
Store 1.0 Store.qml
singleton Config 1.0 Config.qml
Tracer 1.0 Tracer.qml
+TouchPointsTracer 1.0 TouchPointsTracer.qml
Cursor 1.0 Cursor.qml
diff --git a/imports_system/system/controls/+lucee/PopupItem.qml b/imports_system/system/controls/+lucee/PopupItem.qml
index 78eabac3..41de7eb5 100644
--- a/imports_system/system/controls/+lucee/PopupItem.qml
+++ b/imports_system/system/controls/+lucee/PopupItem.qml
@@ -40,6 +40,9 @@ import shared.controls 1.0
AbstractPopupItem {
id: root
+ property alias closeToolButton: closeToolButton
+ property alias popupBg: popupBg
+
onVisibleChanged: {
if (visible) {
//put cursor on close button as default
@@ -63,6 +66,7 @@ AbstractPopupItem {
}
}
background: ScalableBorderImage {
+ id: popupBg
anchors.fill: root
source: Style.image("popup-background-9patch")
anchors.leftMargin: Sizes.dp(-7)
@@ -89,20 +93,15 @@ AbstractPopupItem {
ToolButton {
id: closeToolButton
+ z: parent.z + 1 // close button should be upper then content
objectName: "popupClose"
anchors.top: parent.top
anchors.right: parent.right
anchors.margins: Sizes.dp(17)
width: Sizes.dp(50)
height: Sizes.dp(50)
-
- contentItem: NeptuneIconLabel {
- anchors.centerIn: parent
- icon.color: Style.accentColor
- icon.name: "ic-close"
- iconScale: Sizes.scale
- }
-
+ icon.color: Style.accentColor
+ icon.name: "ic-close"
onClicked: { root.closeHandler(); }
}
}
diff --git a/imports_system/system/controls/AbstractPopupItem.qml b/imports_system/system/controls/AbstractPopupItem.qml
index ef765dd0..3927456e 100644
--- a/imports_system/system/controls/AbstractPopupItem.qml
+++ b/imports_system/system/controls/AbstractPopupItem.qml
@@ -46,7 +46,7 @@ Control {
Keys.onEscapePressed: { root.closeHandler(); }
- // X and Y potition of the popup when open.
+ // X and Y position of the popup when open.
// By default you have it horizontally centered and vertically aligned to the bottom
property real popupX: Math.round((root.parent.width - root.width) / 2)
property real popupY: root.parent.height - root.height - Sizes.dp(90)
@@ -100,7 +100,7 @@ Control {
Connections {
target: parent ? parent : null
ignoreUnknownSignals: true
- onOverlayClicked: {
+ function onOverlayClicked() {
root.closeHandler()
}
}
diff --git a/imports_system/system/controls/PopupItem.qml b/imports_system/system/controls/PopupItem.qml
index b37e376b..babf0774 100644
--- a/imports_system/system/controls/PopupItem.qml
+++ b/imports_system/system/controls/PopupItem.qml
@@ -41,6 +41,9 @@ import shared.controls 1.0
AbstractPopupItem {
id: root
+ property alias closeToolButton: closeToolButton
+ property alias popupBg: popupBg
+
onVisibleChanged: {
if (visible) {
//put cursor on close button as default
@@ -64,6 +67,7 @@ AbstractPopupItem {
}
}
background: ScalableBorderImage {
+ id: popupBg
anchors.fill: root
source: Style.image("popup-background-9patch")
anchors.leftMargin: Sizes.dp(-40)
@@ -89,6 +93,7 @@ AbstractPopupItem {
ToolButton {
id: closeToolButton
+ z: parent.z + 1 // close button should be upper then content
objectName: "popupClose"
anchors.verticalCenter: parent.top
anchors.horizontalCenter: parent.right
diff --git a/imports_system/system/controls/PopupItemLoader.qml b/imports_system/system/controls/PopupItemLoader.qml
index 4cc907f3..5c87b0e4 100644
--- a/imports_system/system/controls/PopupItemLoader.qml
+++ b/imports_system/system/controls/PopupItemLoader.qml
@@ -31,6 +31,7 @@
****************************************************************************/
import QtQuick 2.10
+import QtQml 2.14
/*
Loads a PopupItem on demand
@@ -63,7 +64,7 @@ Loader {
Connections {
target: item
- onClosed: {
+ function onClosed() {
root.closed();
}
}
@@ -74,10 +75,28 @@ Loader {
}
}
- Binding { target: root.item; property: "parent"; value: root.popupParent }
- Binding { target: root.item; property: "originItem"; value: root.originItem }
- Binding { target: root.item; property: "originItemX"; value: root.originItemX }
- Binding { target: root.item; property: "originItemY"; value: root.originItemY }
- Binding { target: root.item; when: root.popupX !== null; property: "popupX"; value: root.popupX }
- Binding { target: root.item; when: root.popupY !== null; property: "popupY"; value: root.popupY }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: root.item; property: "parent"; value: root.popupParent;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: root.item; property: "originItem"; value: root.originItem;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: root.item; property: "originItemX"; value: root.originItemX;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: root.item; property: "originItemY"; value: root.originItemY;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: root.item; when: root.popupX !== null; property: "popupX"; value: root.popupX;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: root.item; when: root.popupY !== null; property: "popupY"; value: root.popupY;
+ }
}
diff --git a/imports_system/system/models/application/ApplicationInfo.qml b/imports_system/system/models/application/ApplicationInfo.qml
index 99739681..a925fc71 100644
--- a/imports_system/system/models/application/ApplicationInfo.qml
+++ b/imports_system/system/models/application/ApplicationInfo.qml
@@ -131,12 +131,36 @@ QtObject {
readonly property int timeToFirstICWindowFrame:
d.startCallTime !== null && d.icWindowFirstFrameTime !== null ? d.icWindowFirstFrameTime - d.startCallTime
: -1
+
+ /* List of apps to be launched before this app, if \s start is requested */
+ property var runBefore: []
+
+ /* List of apps to be launched after this app, if \s start is requested */
+ property var runAfter: []
+
function start() {
- if (application) {
+ if (!!application) {
+ if (!!root.runBefore) {
+ for (var appinfo_i in root.runBefore) {
+ var rb_app = root.runBefore[appinfo_i];
+ if (!!rb_app)
+ rb_app.start();
+ }
+ }
+
if (application.runState === ApplicationObject.NotRunning && d.startCallTime === null) {
d.startCallTime = Date.now();
}
+
application.start();
+
+ if (!!root.runAfter) {
+ for (appinfo_i in root.runAfter) {
+ var ra_app = root.runBefore[appinfo_i];
+ if (!!ra_app)
+ ra_app.start();
+ }
+ }
}
}
@@ -174,7 +198,7 @@ QtObject {
target: root.application
enabled: target != null
ignoreUnknownSignals: true
- onRunStateChanged: {
+ function onRunStateChanged() {
if (root.application.runState === ApplicationObject.NotRunning) {
d.startCallTime = null;
}
@@ -185,7 +209,7 @@ QtObject {
target: d.window && d.window.waylandSurface ? d.window.waylandSurface : null
enabled: target != null && d.windowFirstFrameTime === null
ignoreUnknownSignals: true
- onRedraw: {
+ function onRedraw() {
d.windowFirstFrameTime = Date.now();
}
}
@@ -194,7 +218,7 @@ QtObject {
target: d.icWindow && d.icWindow.waylandSurface ? d.icWindow.waylandSurface : null
enabled: target != null && d.icWindowFirstFrameTime === null
ignoreUnknownSignals: true
- onRedraw: {
+ function onRedraw() {
d.icWindowFirstFrameTime = Date.now();
}
}
diff --git a/imports_system/system/models/application/ApplicationModel.qml b/imports_system/system/models/application/ApplicationModel.qml
index 916826e4..b28e4a23 100644
--- a/imports_system/system/models/application/ApplicationModel.qml
+++ b/imports_system/system/models/application/ApplicationModel.qml
@@ -67,14 +67,11 @@ ListModel {
// Whether the Neptune 3 UI runs on single- / multi-process mode.
readonly property bool singleProcess: ApplicationManager.singleProcess
- // Holds list of autostart applications ids, only initialized on Neptune startup
- // afterward values are taken from
- property string autostartApps: ""
-
signal shuttingDown()
signal applicationPopupAdded(var window)
signal autostartAppsListChanged()
signal autorecoverAppsListChanged()
+ signal widgetStatesChanged()
signal appRemoved(var appInfo);
// Populate the model
@@ -287,11 +284,10 @@ ListModel {
property Component appInfoComponent: Component { ApplicationInfo{} }
function appendApplication(app) {
- var appInfo = appInfoComponent.createObject(root, {"application":app});
+ var appInfo = appInfoComponent.createObject(root, {"application": app});
appInfo.localeCode = Qt.binding(function() { return root.localeCode; });
appInfo.isSystemApp = root.isSystemApp(app)
- appInfo.autostart = (root.autostartApps.indexOf(appInfo.id) > -1)
if (d.isInstrumentClusterApp(app)) {
d.instrumentClusterAppInfo = appInfo;
@@ -302,25 +298,6 @@ ListModel {
}
root.append({"appInfo": appInfo})
-
- if (appInfo.autostart && !d.isInstrumentClusterApp(app) && !d.isHUDApp(app)) {
- appInfo.start();
- goHome();
- }
-
- // check if additional screen is attached and cluster is expected to be shown
- if (root.showCluster) {
- if (appInfo.autostart && d.isInstrumentClusterApp(app)) {
- appInfo.start();
- }
- }
-
- // check if additional screen is attached and hud is expected to be shown
- if (root.showHUD) {
- if (appInfo.autostart && d.isHUDApp(app)) {
- appInfo.start();
- }
- }
}
function deserializeWidgetStates(widgetStates)
@@ -373,6 +350,7 @@ ListModel {
}
}
}
+
function deserializeAutostart(str)
{
//reset to defaults
@@ -390,6 +368,23 @@ ListModel {
if (appInfo)
appInfo.autostart = true;
+ else continue;
+
+ var app = appInfo.application;
+ if (!d.isInstrumentClusterApp(app) && !d.isHUDApp(app)) {
+ appInfo.start();
+ goHome(); // TODO: whether it always necessary?
+ }
+
+ // check if additional screen is attached and cluster is expected to be shown
+ if (root.showCluster && d.isInstrumentClusterApp(app)) {
+ appInfo.start();
+ }
+
+ // check if additional screen is attached and hud is expected to be shown
+ if (root.showHUD && d.isHUDApp(app)) {
+ appInfo.start();
+ }
}
}
@@ -404,18 +399,54 @@ ListModel {
}
}
+ // this function iterates through current model and tries to fill 'runBefore' and 'runAfter' for
+ // each appInfo inside it with available in current model appInfo-s
+ function fillStartListsForCurrentModel() {
+ // this loop works with AppInfo objects
+ for (var i = 0; i < count; ++i) {
+ var appInfo = get(i).appInfo;
+ var runBefore = appInfo.application.applicationProperties["runBefore"];
+ if (!!runBefore) {
+ for (var rbi in runBefore) {
+ var rb_app = root.applicationFromId(runBefore[rbi]);
+ if (!!rb_app)
+ appInfo.runBefore.push(rb_app);
+ }
+ }
+
+ var runAfter = appInfo.application.applicationProperties["runAfter"];
+ if (!!runAfter) {
+ for (var ra in runAfter) {
+ var ra_app = root.applicationFromId(ra);
+ if (!!ra_app)
+ appInfo.runAfter.push(ra_app);
+ }
+ }
+ }
+
+ for (i = 0; i < count; ++i) {
+ appInfo = get(i).appInfo;
+ appInfo.runBefore = [...new Set(appInfo.runBefore)];
+ appInfo.runAfter = [...new Set(appInfo.runAfter)];
+ }
+ }
+
Component.onCompleted: {
+ // details: the loop below fills the application model from 'raw' QtAM::application
+ // with AppInfo objects
var i;
for (i = 0; i < ApplicationManager.count; i++) {
var app = ApplicationManager.application(i);
d.appendApplication(app);
}
+
+ fillStartListsForCurrentModel();
}
property var appManConns: Connections {
target: ApplicationManager
- onApplicationWasActivated: d.reactOnAppActivation(id);
- onApplicationRunStateChanged: {
+ function onApplicationWasActivated(id, aliasId) { d.reactOnAppActivation(id); }
+ function onApplicationRunStateChanged(id, runState) {
var appInfo = root.applicationFromId(id);
if (!appInfo) {
return;
@@ -466,12 +497,14 @@ ListModel {
}
}
- onApplicationAdded: {
+ function onApplicationAdded(id) {
var app = ApplicationManager.application(id);
d.appendApplication(app);
+
+ fillStartListsForCurrentModel();
}
- onApplicationAboutToBeRemoved: {
+ function onApplicationAboutToBeRemoved(id) {
var appInfo = null;
var index;
@@ -504,7 +537,7 @@ ListModel {
root.appRemoved(appInfo);
}
- onShuttingDownChanged: {
+ function onShuttingDownChanged() {
if (ApplicationManager.shuttingDown) {
root.shuttingDown();
}
@@ -514,18 +547,18 @@ ListModel {
property var winManConns: Connections {
target: WindowManager
- onWindowAdded: {
+ function onWindowAdded(window) {
var appInfo = applicationFromId(window.application.id);
var isRegularApp = !!appInfo && !root.isSystemApp(appInfo);
- var isPopupWindow = window.windowProperty("windowType") === "popup";
+ var isPopupWindow = window.windowProperty("windowType") === "popup" || !!window.popup;
if (isPopupWindow) {
root.applicationPopupAdded(window)
}
- if (isRegularApp) {
+ if (isRegularApp && !isPopupWindow) {
var isApplicationICWindow = window.windowProperty("windowType") === "instrumentcluster";
var isApplicationCCWindow = !window.windowProperty("windowType");
@@ -539,7 +572,7 @@ ListModel {
// application will be added to the bottom bar window as well
}
- if (d.isBottomBarApp(window.application) && window.windowProperty("windowType") !== "popup") {
+ if (d.isBottomBarApp(window.application) && !isPopupWindow) {
d.bottomBarAppInfo.priv.window = window;
}
@@ -557,7 +590,7 @@ ListModel {
}
}
- onWindowAboutToBeRemoved: {
+ function onWindowAboutToBeRemoved(window) {
var appInfo = applicationFromId(window.application.id);
if (!appInfo) {
if (d.isInstrumentClusterApp(window.application)) {
@@ -580,7 +613,7 @@ ListModel {
}
}
- onWindowPropertyChanged: {
+ function onWindowPropertyChanged(window, name, value) {
var appInfo = applicationFromId(window.application.id);
switch (name) {
case "activationCount":
@@ -589,6 +622,10 @@ ListModel {
window.application.activated();
d.reactOnAppActivation(window.application.id);
break;
+ case "neptuneState":
+ if (window.windowProperty(name).startsWith("Widget") && root.activeAppInfo === null)
+ root.widgetStatesChanged()
+ break;
}
}
}
diff --git a/imports_system/system/models/notification/NotificationModel.qml b/imports_system/system/models/notification/NotificationModel.qml
index 244d3a4e..ba2eca9c 100644
--- a/imports_system/system/models/notification/NotificationModel.qml
+++ b/imports_system/system/models/notification/NotificationModel.qml
@@ -46,21 +46,16 @@ QtObject {
readonly property Connections notificationManagerConnection: Connections {
target: root.model
- onNotificationAdded: {
+ function onNotificationAdded() {
root.notificationAdded();
}
- onNotificationAboutToBeRemoved: {
+ function onNotificationAboutToBeRemoved() {
root.notificationRemoved();
}
}
- function showNotification() {
- root.notificationToastVisible = true;
- }
-
function closeNotification() {
- root.notificationToastVisible = false;
root.notificationClosed();
}
@@ -77,6 +72,7 @@ QtObject {
while (root.count > 0) {
removeNotification(NotificationManager.get(0).id);
}
+
root.notificationsCleared();
}
}
diff --git a/imports_system/system/requests/ApplicationRequestHandler.qml b/imports_system/system/requests/ApplicationRequestHandler.qml
index da544f57..9ca8d73c 100644
--- a/imports_system/system/requests/ApplicationRequestHandler.qml
+++ b/imports_system/system/requests/ApplicationRequestHandler.qml
@@ -111,7 +111,7 @@ QtObject {
readonly property var appManConns: Connections {
target: ApplicationManager
- onOpenUrlRequested: {
+ function onOpenUrlRequested(requestId, url, mimeType, possibleAppIds) {
sendRequest(requestId, possibleAppIds);
}
}
diff --git a/neptune3-ui.pro b/neptune3-ui.pro
index 3c1c30ac..9a6974be 100644
--- a/neptune3-ui.pro
+++ b/neptune3-ui.pro
@@ -7,37 +7,36 @@ QT_FOR_CONFIG += ivicore
CONFIG += no_ivigenerator_available
}
requires(!no_ivigenerator_available)
+requires(qtHaveModule(appman_main-private))
!qtHaveModule(qtsaferenderer)|load(qtsaferenderer-tools):!qtsaferenderer-tools-available {
log("$$escape_expand(\\n\\n) *** The qtsaferenderer module or tools are not available: Make sure that QtSafeRenderer is installed and configured correctly ***$$escape_expand(\\n\\n)")
}
-!qtHaveModule(3dstudioruntime2){
- log("$$escape_expand(\\n\\n)[Warning] The 3dstudioruntime2 optional module is not available. $$escape_expand(\\n)[Warning] Neptune 3 UI can't show 3D content made with Qt 3D Studio without this module.$$escape_expand(\\n)[Warning] To show this content install Qt 3D Studio or the runtime.$$escape_expand(\\n\\n)")
+!qtHaveModule(studio3d){
+ log("$$escape_expand(\\n\\n)[Warning] The studio3d optional module is not available. $$escape_expand(\\n)[Warning] Neptune 3 UI can't show some 3D content made with Qt 3D Studio without this module.$$escape_expand(\\n)[Warning] To show this content install the ogl-runtime.$$escape_expand(\\n\\n)")
+}
+
+enable-examples {
+ NEPTUNE3-UI_BUILD_PARTS = $$QT_BUILD_PARTS
+ NEPTUNE3-UI_BUILD_PARTS *= examples
+}
+
+enable-tests {
+ NEPTUNE3-UI_BUILD_PARTS = $$QT_BUILD_PARTS
+ NEPTUNE3-UI_BUILD_PARTS *= tests
}
-TEMPLATE = subdirs
+load(qt_parts)
include(config.pri)
SUBDIRS += plugins
SUBDIRS += doc
-# mainly a hint for Qt Creator
-QML_IMPORT_PATH += imports_shared imports_system sysui
-
copydata.file = copydata.pro
-copydata.depends = plugins
-
-requires(qtHaveModule(appman_main-private))
-
-SUBDIRS += src
-copydata.depends += src
+copydata.depends += sub_src
copydata.depends += plugins
-
-SUBDIRS += examples
-examples.depends += src
-
SUBDIRS += copydata
android: INSTALL_PATH = $$INSTALL_PREFIX
@@ -57,35 +56,9 @@ INSTALLS += server
OTHER_FILES += $$files($$PWD/*.qml, true)
OTHER_FILES += $$files($$PWD/*.qmldir, true)
-OTHER_FILES += $$PWD/plugins.yaml.in
OTHER_FILES += .qmake.conf
OTHER_FILES += $$files($$PWD/squishtests/*, true)
OTHER_FILES += $$files($$PWD/qmake-features/*, true)
-PLUGINS_DIR = $$OUT_PWD/qml
-QMAKE_SUBSTITUTES += $$PWD/plugins.yaml.in
-
-# tests configuration
-enable-tests:QT_BUILD_PARTS *= tests
-else:contains(QT_BUILD_PARTS, "tests"):CONFIG += enable-tests
-
-# the following code-block was reused from qt_modules.prf
-buildParts = $$eval($$upper($$TARGET)_BUILD_PARTS)
-!isEmpty(buildParts): QT_BUILD_PARTS = $$buildParts
-exists($$_PRO_FILE_PWD_/tests/tests.pro) {
- sub_tests.subdir = tests
- sub_tests.target = sub-tests
- contains(SUBDIRS, sub_src): sub_tests.depends = sub_src # The tests may have a run-time only dependency on other parts
- contains(SUBDIRS, sub_tools): sub_tests.depends += sub_tools
- sub_tests.CONFIG = no_default_install
- !contains(QT_BUILD_PARTS, tests) {
- sub_tests.CONFIG += no_default_target
- } else: !uikit {
- # Make sure these are there in case we need them
- sub_tools.CONFIG -= no_default_target
- sub_examples.CONFIG -= no_default_target
- sub_demos.CONFIG -= no_default_target
- }
- SUBDIRS += sub_tests
- sub_tests.depends = copydata plugins src
-}
-QT_BUILD_PARTS -= tests
+
+# mainly a hint for Qt Creator
+QML_IMPORT_PATH += imports_shared imports_system sysui
diff --git a/plugins.yaml.in b/plugins.yaml.in
deleted file mode 100644
index 750e9b9a..00000000
--- a/plugins.yaml.in
+++ /dev/null
@@ -1,11 +0,0 @@
-formatVersion: 1
-formatType: am-configuration
----
-runtimes:
- qml:
- importPaths: [ \"$$PLUGINS_DIR\" ]
-
-# ... as well as the SystemUI
-
-ui:
- importPaths: [ \"$$PLUGINS_DIR\" ]
diff --git a/plugins/com.pelagicore.map/mapshelper.cpp b/plugins/com.pelagicore.map/mapshelper.cpp
index 0220c492..9bf38276 100644
--- a/plugins/com.pelagicore.map/mapshelper.cpp
+++ b/plugins/com.pelagicore.map/mapshelper.cpp
@@ -57,12 +57,14 @@ QString MapsHelper::appPath() const
return m_appPath;
}
-void MapsHelper::initMap()
+void MapsHelper::initMap(const QString &uniqueDirName)
{
// copy mapboxgl offline DB
const QString sourceFile = m_appPath + QStringLiteral("maps/mapboxgl.db");
const QString destDir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation);
- const QString destFile = destDir + QStringLiteral("/mapboxgl.db");
+ const QString destFile = destDir
+ + (uniqueDirName.isEmpty() ? uniqueDirName : '/' + uniqueDirName)
+ + QStringLiteral("/mapboxgl.db");
QString subSourceFile = sourceFile.mid(7);
QDir dir;
diff --git a/plugins/com.pelagicore.map/mapshelper.h b/plugins/com.pelagicore.map/mapshelper.h
index 036f05ea..8bbaf0fa 100644
--- a/plugins/com.pelagicore.map/mapshelper.h
+++ b/plugins/com.pelagicore.map/mapshelper.h
@@ -48,7 +48,7 @@ public:
void setAppPath(const QString &appPath);
QString appPath() const;
- Q_INVOKABLE void initMap();
+ Q_INVOKABLE void initMap(const QString &uniqueDirName = QString());
signals:
void appPathChanged();
diff --git a/plugins/controls/ListItem.qml b/plugins/controls/ListItem.qml
index c51b4ccc..7f181f92 100644
--- a/plugins/controls/ListItem.qml
+++ b/plugins/controls/ListItem.qml
@@ -98,6 +98,9 @@ ListItemBasic {
Cursor {
acceptsCursor: (root.rightToolSymbol === "")
+ onActivated: {
+ root.clicked();
+ }
}
accessoryDelegateComponent1: Label {
diff --git a/plugins/controls/ListItemBasic.qml b/plugins/controls/ListItemBasic.qml
index 28fc94de..3ea7538b 100644
--- a/plugins/controls/ListItemBasic.qml
+++ b/plugins/controls/ListItemBasic.qml
@@ -40,6 +40,7 @@ import QtGraphicalEffects 1.0
import shared.utils 1.0
import shared.Style 1.0
import shared.Sizes 1.0
+import shared.controls 1.0
/*!
\qmltype ListItemBasic
@@ -164,17 +165,28 @@ ItemDelegate {
Item {
//spacer, to trigger 24px margin to the left of first element
- width: Sizes.dp(1)
- height: parent.height
+ implicitWidth: Sizes.dp(1)
+ Layout.fillHeight: true
}
- IconLabel {
- opacity: Style.opacityHigh
- scale: Sizes.scale
- spacing: root.spacing
- mirrored: root.mirrored
- display: root.display
- icon: root.icon
+ Item {
+ Layout.fillHeight: true
+ implicitWidth: root.implicitHeight
+ visible: root.icon.source.toString() !== "" || root.icon.name !== ""
+ NeptuneIconLabel {
+ opacity: Style.opacityHigh
+ iconScale: Sizes.scale
+ spacing: root.spacing
+ mirrored: root.mirrored
+ display: root.display
+ icon: root.icon
+ anchors.centerIn: parent
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: root.clicked()
+ }
+ }
}
ColumnLayout {
@@ -196,6 +208,11 @@ ItemDelegate {
opacity: Style.opacityHigh
visible: root.text
color: Style.contrastColor
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: root.clicked()
+ }
}
Label {
diff --git a/plugins/controls/ListItemSwitch.qml b/plugins/controls/ListItemSwitch.qml
index 35c30053..32b2dbb4 100644
--- a/plugins/controls/ListItemSwitch.qml
+++ b/plugins/controls/ListItemSwitch.qml
@@ -122,7 +122,7 @@ ListItemBasic {
Connections {
target: root
- onClicked: switchDelegate.toggle()
+ function onClicked() { switchDelegate.toggle() }
}
}
}
diff --git a/plugins/controls/ToolsColumn.qml b/plugins/controls/ToolsColumn.qml
index 50a785f7..7b876272 100644
--- a/plugins/controls/ToolsColumn.qml
+++ b/plugins/controls/ToolsColumn.qml
@@ -40,14 +40,14 @@ import shared.utils 1.0
/*!
\qmltype ToolsColumn
\inqmlmodule controls
- \inherits ColumnLayout
+ \inherits ListView
\since 5.11
\brief The tools column component for Neptune 3 UI applications.
The ToolsColumn provides a custom column of tool buttons for Neptune 3 UI Applications
to follow the specification where only one of them can be selected at any given time.
- \image tools-column.jpg
+ \image tools-column.png
See \l{Neptune 3 UI Components and Interfaces} to see more available components in
Neptune 3 UI.
@@ -101,42 +101,49 @@ import shared.utils 1.0
\endqml
*/
-ColumnLayout {
+ListView {
id: root
- width: Sizes.dp(135)
+ implicitWidth: Sizes.dp(135)
+ implicitHeight: root.contentHeight
spacing: Sizes.dp(24)
+ interactive: false
/*!
- \qmlproperty int ToolsColumn::currentIndex
+ \qmlproperty enumeration ToolsColumn::iconFillMode
- This property holds the current selected index of the tools column.
-
- This property's default is 0.
+ Set this property to define what happens when the item's icon image has a different size
+ than the item. Please refer to \l{Image::fillMode} for possible values.
+ For values other than Image.Pad \l{ToolsColumn::iconRectWidth} and
+ \l {ToolsColumn::iconRectHeight} should be defined.
*/
- property int currentIndex: 0
+ property int iconFillMode: Image.Pad
/*!
- \qmlproperty string ToolsColumn::currentText
- \readonly
+ \qmlpropery real ToolsColumn::iconRectWidth
- This property holds the current selected text of the tools column.
+ Set this property to define width of rectangle area for icon when
+ \l{ToolsColumn::iconfillMode} has other value than Image.Pad.
*/
- readonly property string currentText: model ? model.get(currentIndex).text : ""
+ property real iconRectWidth: 0
/*!
- \qmlproperty string ToolsColumn::currentItem
+ \qmlpropery real ToolsColumn::iconRectHeight
- This property holds the current selected item of the tools column.
+ Set this property to define height of rectangle area for icon when
+ \l{ToolsColumn::iconfillMode} has other value than Image.Pad.
*/
- property Item currentItem: repeater.itemAt(currentIndex)
+ property real iconRectHeight: 0
/*!
- \qmlproperty var ToolsColumn::model
+ \qmlproperty string ToolsColumn::currentText
+ \readonly
- This property holds the model to be delegated in the tools column.
+ This property holds the current selected text of the tools column.
*/
- property alias model: repeater.model
+ readonly property string currentText: model && currentIndex > -1 && model.count > currentIndex
+ ? model.get(currentIndex).text
+ : ""
/*!
\qmlproperty string ToolsColumn::translationContext
@@ -157,15 +164,13 @@ ColumnLayout {
ButtonGroup { id: buttonGroup }
- Repeater {
- id: repeater
-
- ToolButton {
- Layout.preferredWidth: Sizes.dp(135)
- Layout.preferredHeight: Sizes.dp(140)
- Layout.alignment: Qt.AlignHCenter
+ delegate: ToolButton {
+ height: Sizes.dp(140); width: root.width
objectName: model.objectName ? model.objectName : ""
baselineOffset: 0
+ iconFillMode: root.iconFillMode
+ iconRectWidth: root.iconRectWidth
+ iconRectHeight: root.iconRectHeight
checkable: true
checked: root.currentIndex === index
icon.name: model.icon ? (checked ? model.icon + "_ON" : model.icon + "_OFF") : ""
@@ -182,9 +187,13 @@ ColumnLayout {
}
ButtonGroup.group: buttonGroup
}
- }
- Item {
- Layout.fillHeight: true
+ Connections {
+ target: root.model
+ function onCountChanged() {
+ if (currentIndex > 0 && model.count <= currentIndex) {
+ currentIndex = 0;
+ }
+ }
}
}
diff --git a/plugins/controls/neptuneiconlabel.cpp b/plugins/controls/neptuneiconlabel.cpp
index 26d3f002..0f0c5503 100644
--- a/plugins/controls/neptuneiconlabel.cpp
+++ b/plugins/controls/neptuneiconlabel.cpp
@@ -31,12 +31,13 @@
#include "neptuneiconlabel.h"
#include "neptuneiconlabel_p.h"
-#include <QtQuickControls2/private/qquickiconimage_p.h> // #include "qquickiconimage_p.h"
-#include <QtQuickControls2/private/qquickmnemoniclabel_p.h> // #include "qquickmnemoniclabel_p.h"
+#include <QtQuickControls2/private/qquickiconimage_p.h>
+#include <QtQuickControls2/private/qquickmnemoniclabel_p.h>
#include <QtGui/private/qguiapplication_p.h>
#include <QtQuick/private/qquickitem_p.h>
#include <QtQuick/private/qquicktext_p.h>
+#include <QtQml>
#include <QFileSelector>
@@ -85,13 +86,14 @@ bool NeptuneIconLabelPrivate::createImage()
return false;
image = new QQuickIconImage(q);
+ QObject::connect(image, &QQuickIconImage::statusChanged,
+ q, &NeptuneIconLabel::onImageStatusChanged);
watchChanges(image);
beginClass(image);
image->setObjectName(QStringLiteral("image"));
image->setName(icon.name());
QFileSelector selector;
image->setSource(selector.select(icon.source()));
- image->setSourceSize(QSize(icon.width(), icon.height()));
image->setColor(icon.color());
QQmlEngine::setContextForObject(image, qmlContext(q));
if (componentComplete)
@@ -125,7 +127,6 @@ void NeptuneIconLabelPrivate::syncImage()
image->setName(icon.name());
QFileSelector selector;
image->setSource(selector.select(icon.source()));
- image->setSourceSize(QSize(icon.width(), icon.height()));
image->setColor(icon.color());
const int valign = alignment & Qt::AlignVertical_Mask;
image->setVerticalAlignment(static_cast<QQuickImage::VAlignment>(valign));
@@ -209,26 +210,43 @@ void NeptuneIconLabelPrivate::updateOrSyncLabel()
void NeptuneIconLabelPrivate::updateImplicitSize()
{
Q_Q(NeptuneIconLabel);
+
const bool showIcon = image && hasIcon();
const bool showText = label && hasText();
const qreal horizontalPadding = leftPadding + rightPadding;
const qreal verticalPadding = topPadding + bottomPadding;
- const qreal iconImplicitWidth = showIcon ? image->implicitWidth() : 0;
- const qreal iconImplicitHeight = showIcon ? image->implicitHeight() : 0;
+ qreal iconImplicitWidth = showIcon ? image->implicitWidth() : 0;
+ qreal iconImplicitHeight = showIcon ? image->implicitHeight() : 0;
const qreal textImplicitWidth = showText ? label->implicitWidth() : 0;
const qreal textImplicitHeight = showText ? label->implicitHeight() : 0;
const qreal effectiveSpacing = showText && showIcon && image->implicitWidth() > 0 ? spacing : 0;
- const qreal implicitWidth = display == NeptuneIconLabel::TextBesideIcon ? iconImplicitWidth + textImplicitWidth + effectiveSpacing
- : qMax(iconImplicitWidth, textImplicitWidth);
- const qreal implicitHeight = display == NeptuneIconLabel::TextUnderIcon ? iconImplicitHeight + textImplicitHeight + effectiveSpacing
- : qMax(iconImplicitHeight, textImplicitHeight);
+
+ // for Pad we apply scaling to image object, so it will be *iconScale size in result
+ // implicitWidth of image is equal to 1.0 scaled image
+ if (iconFillMode == QQuickImage::Pad) {
+ iconImplicitWidth *= iconScale;
+ iconImplicitHeight *= iconScale;
+ } else {
+ iconImplicitWidth = iconRectWidth;
+ iconImplicitHeight = iconRectHeight;
+ }
+
+ const qreal implicitWidth = display == NeptuneIconLabel::TextBesideIcon
+ ? iconImplicitWidth + textImplicitWidth + effectiveSpacing
+ : qMax(iconImplicitWidth, textImplicitWidth);
+ const qreal implicitHeight = display == NeptuneIconLabel::TextUnderIcon
+ ? iconImplicitHeight + textImplicitHeight + effectiveSpacing
+ : qMax(iconImplicitHeight, textImplicitHeight);
+
q->setImplicitSize(implicitWidth + horizontalPadding, implicitHeight + verticalPadding);
}
// adapted from QStyle::alignedRect()
-static QRectF alignedRect(bool mirrored, Qt::Alignment alignment, const QSizeF &size, const QRectF &rectangle)
+static QRectF alignedRect(bool mirrored, Qt::Alignment alignment, const QSizeF &size,
+ const QRectF &rectangle)
{
- alignment = QGuiApplicationPrivate::visualAlignment(mirrored ? Qt::RightToLeft : Qt::LeftToRight, alignment);
+ alignment = QGuiApplicationPrivate::visualAlignment(mirrored ? Qt::RightToLeft
+ : Qt::LeftToRight, alignment);
qreal x = rectangle.x();
qreal y = rectangle.y();
const qreal w = size.width();
@@ -244,31 +262,74 @@ static QRectF alignedRect(bool mirrored, Qt::Alignment alignment, const QSizeF &
return QRectF(x, y, w, h);
}
+void NeptuneIconLabelPrivate::applyIconSizeAndPosition(const QRectF &iconRect) {
+ Q_ASSERT(image);
+
+ // if we are using scaled image we have first to upscale and shift image item
+ // according to iconScale (image.scale()), so when item is actually scaled, it will
+ // be the iconRect size at iconRect.topLeft position
+ // Do nothing in case of zero scale or 1.0 scale, just apply calculated iconRect
+ if (image->scale() > 0 && !qFuzzyCompare(image->scale(), 1.0)) {
+ image->setSize(iconRect.size() / image->scale());
+ const QPointF shift{(image->size().width() - iconRect.size().width()) * 0.5,
+ (image->size().height() - iconRect.size().height()) * 0.5};
+ image->setPosition(iconRect.topLeft() - shift);
+ } else {
+ // To avoid aliasing, apply only integer values for position
+ // and size. Only valid for non-Pad mode
+ image->setSize(iconRect.size().toSize());
+ image->setPosition(iconRect.topLeft().toPoint());
+ }
+}
+
void NeptuneIconLabelPrivate::layout()
{
+ // layout() is called to arrange image and text elements inside NeptuneIconLabel item
+ //
+ // We have:
+ // 1. available area to fit
+ // 2. pre-defined icon rect size for image of iconRectWidth x iconRectHeight
+ // 3. fillMode
+ // If fill mode is not Pad, then we are trying to fit image inside pre-defined icon rect
+ // If pre-defined icon rect doesn't fit available size, min size is selected for resulting image
+ // rect
+ // If Pad mode is set, image is displayed according to defined iconScale multiplied by
+ // (source image pixel size). With Pad set image will be sliced by NeptuneIconLabel item borders
+
if (!componentComplete)
return;
const qreal availableWidth = width - leftPadding - rightPadding;
const qreal availableHeight = height - topPadding - bottomPadding;
+ // these sizes later compared to available item size, minimum is selected
+ qreal iconWidth{iconRectWidth};
+ qreal iconHeight{iconRectHeight};
+
+ if (image && image->status() == QQuickImageBase::Ready && iconFillMode == QQuickImage::Pad) {
+ // if Pad mode, use implicit size * iconScale
+ // implicit size is set after image is loaded
+ iconWidth = image->implicitWidth() * iconScale;
+ iconHeight = image->implicitHeight() * iconScale;
+ }
+
switch (display) {
case NeptuneIconLabel::IconOnly:
- if (image) {
+ if (image && image->status() == QQuickImageBase::Ready) {
+ // Align rect for image according to available space
const QRectF iconRect = alignedRect(mirrored, alignment,
- QSizeF(qMin(image->implicitWidth() * iconScale, availableWidth),
- qMin(image->implicitHeight() * iconScale, availableHeight)),
- QRectF(leftPadding, topPadding, availableWidth, availableHeight));
- image->setSize(iconRect.size());
- image->setPosition(iconRect.topLeft());
+ QSizeF(qMin(iconWidth, availableWidth),
+ qMin(iconHeight, availableHeight)),
+ QRectF(leftPadding, topPadding, availableWidth, availableHeight));
+ applyIconSizeAndPosition(iconRect);
}
break;
case NeptuneIconLabel::TextOnly:
if (label) {
const QRectF textRect = alignedRect(mirrored, alignment,
- QSizeF(qMin(label->implicitWidth(), availableWidth),
- qMin(label->implicitHeight(), availableHeight)),
- QRectF(leftPadding, topPadding, availableWidth, availableHeight));
+ QSizeF(qMin(label->implicitWidth(), availableWidth),
+ qMin(label->implicitHeight(), availableHeight)),
+ QRectF(leftPadding, topPadding, availableWidth, availableHeight));
label->setSize(textRect.size());
label->setPosition(textRect.topLeft());
}
@@ -276,67 +337,72 @@ void NeptuneIconLabelPrivate::layout()
case NeptuneIconLabel::TextUnderIcon: {
// Work out the sizes first, as the positions depend on them.
- QSizeF iconSize;
- QSizeF textSize;
- if (image) {
- iconSize.setWidth(qMin(image->implicitWidth() * iconScale, availableWidth));
- iconSize.setHeight(qMin(image->implicitHeight() * iconScale, availableHeight));
+ QSizeF iconSize{0.0, 0.0};
+ QSizeF textSize{0.0, 0.0};
+ if (image && image->status() == QQuickImageBase::Ready) {
+ iconSize.setWidth(qMin(iconWidth, availableWidth));
+ iconSize.setHeight(qMin(iconHeight, availableHeight));
}
qreal effectiveSpacing = 0;
if (label) {
if (!iconSize.isEmpty())
effectiveSpacing = spacing;
textSize.setWidth(qMin(label->implicitWidth(), availableWidth));
- textSize.setHeight(qMin(label->implicitHeight(), availableHeight - iconSize.height() - effectiveSpacing));
+ textSize.setHeight(qMin(label->implicitHeight(),
+ availableHeight - iconSize.height() - effectiveSpacing));
}
QRectF combinedRect = alignedRect(mirrored, alignment,
- QSizeF(qMax(iconSize.width(), textSize.width()),
- iconSize.height() + effectiveSpacing + textSize.height()),
- QRectF(leftPadding, topPadding, availableWidth, availableHeight));
- if (image) {
- QRectF iconRect = alignedRect(mirrored, Qt::AlignHCenter | Qt::AlignTop, iconSize, combinedRect);
- image->setSize(iconRect.size());
- image->setPosition(iconRect.topLeft());
+ QSizeF(qMax(iconSize.width(), textSize.width()),
+ iconSize.height() + effectiveSpacing + textSize.height()),
+ QRectF(leftPadding, topPadding, availableWidth, availableHeight));
+ if (image && image->status() == QQuickImageBase::Ready) {
+ // Align rect for image according to available space
+ QRectF iconRect = alignedRect(mirrored, Qt::AlignHCenter | Qt::AlignTop, iconSize,
+ combinedRect);
+ applyIconSizeAndPosition(iconRect);
}
if (label) {
- QRectF textRect = alignedRect(mirrored, Qt::AlignHCenter | Qt::AlignBottom, textSize, combinedRect);
+ QRectF textRect = alignedRect(mirrored, Qt::AlignHCenter | Qt::AlignBottom, textSize,
+ combinedRect);
label->setSize(textRect.size());
label->setPosition(textRect.topLeft());
}
break;
}
-
- case NeptuneIconLabel::TextBesideIcon:
default:
+ // includes case NeptuneIconLabel::TextBesideIcon:
// Work out the sizes first, as the positions depend on them.
- QSizeF iconSize(0, 0);
- QSizeF textSize(0, 0);
- if (image) {
- iconSize.setWidth(qMin(image->implicitWidth() * iconScale, availableWidth));
- iconSize.setHeight(qMin(image->implicitHeight() * iconScale, availableHeight));
+ QSizeF iconSize{0.0, 0.0};
+ QSizeF textSize{0.0, 0.0};
+ if (image && image->status() == QQuickImageBase::Ready) {
+ iconSize.setWidth(qMin(iconWidth, availableWidth));
+ iconSize.setHeight(qMin(iconHeight, availableHeight));
}
qreal effectiveSpacing = 0;
if (label) {
if (!iconSize.isEmpty())
effectiveSpacing = spacing;
- textSize.setWidth(qMin(label->implicitWidth(), availableWidth - iconSize.width() - effectiveSpacing));
+ textSize.setWidth(qMin(label->implicitWidth(),
+ availableWidth - iconSize.width() - effectiveSpacing));
textSize.setHeight(qMin(label->implicitHeight(), availableHeight));
}
const QRectF combinedRect = alignedRect(mirrored, alignment,
- QSizeF(iconSize.width() + effectiveSpacing + textSize.width(),
- qMax(iconSize.height(), textSize.height())),
- QRectF(leftPadding, topPadding, availableWidth, availableHeight));
- if (image) {
- const QRectF iconRect = alignedRect(mirrored, Qt::AlignLeft | Qt::AlignVCenter, iconSize, combinedRect);
- image->setSize(iconRect.size());
- image->setPosition(iconRect.topLeft());
+ QSizeF(iconSize.width() + effectiveSpacing + textSize.width(),
+ qMax(iconSize.height(), textSize.height())),
+ QRectF(leftPadding, topPadding, availableWidth, availableHeight));
+ if (image && image->status() == QQuickImageBase::Ready) {
+ // Align rect for image according to available space
+ const QRectF iconRect = alignedRect(mirrored, Qt::AlignLeft | Qt::AlignVCenter,
+ iconSize, combinedRect);
+ applyIconSizeAndPosition(iconRect);
}
if (label) {
- const QRectF textRect = alignedRect(mirrored, Qt::AlignRight | Qt::AlignVCenter, textSize, combinedRect);
+ const QRectF textRect = alignedRect(mirrored, Qt::AlignRight | Qt::AlignVCenter,
+ textSize, combinedRect);
label->setSize(textRect.size());
- label->setPosition(textRect.topLeft());
+ label->setPosition(textRect.topLeft().toPoint());
}
break;
}
@@ -380,6 +446,32 @@ void NeptuneIconLabelPrivate::itemDestroyed(QQuickItem *item)
label = nullptr;
}
+void NeptuneIconLabelPrivate::applyIconScaleForPadMode() {
+ // works only for Pad fill mode (default)
+ if (iconFillMode != QQuickImage::Pad)
+ return;
+
+ image->setScale(iconScale);
+ updateImplicitSize();
+ layout();
+}
+
+void NeptuneIconLabelPrivate::applyIconRect() {
+ // works only for non-Pad fill mode
+ if (iconFillMode == QQuickImage::Pad)
+ return;
+
+ // in non-pad mode scale is not used for image inner object, reset it
+ // it is fitted inside desired rect
+ if (!qFuzzyCompare(image->scale(), 1.0)) {
+ image->setScale(1.0);
+ }
+
+ image->setFillMode(iconFillMode);
+ updateImplicitSize();
+ layout();
+}
+
NeptuneIconLabel::NeptuneIconLabel(QQuickItem *parent)
: QQuickItem(*(new NeptuneIconLabelPrivate), parent)
{
@@ -403,6 +495,7 @@ QQuickIcon NeptuneIconLabel::icon() const
void NeptuneIconLabel::setIcon(const QQuickIcon &icon)
{
Q_D(NeptuneIconLabel);
+
if (d->icon == icon)
return;
@@ -419,10 +512,19 @@ qreal NeptuneIconLabel::iconScale() const
void NeptuneIconLabel::setIconScale(qreal scale)
{
Q_D(NeptuneIconLabel);
- if (d->iconScale == scale)
+ if (qFuzzyCompare(d->iconScale, scale))
return;
+ if (qFuzzyCompare(scale, 0.0) || scale < 0.0) {
+ qmlWarning(this) << "Invalid scale value: " << scale << "must be greater than zero";
+ return;
+ }
+
d->iconScale = scale;
+ if (d->image && d->image->status() == QQuickImageBase::Ready
+ && d->iconFillMode == QQuickImage::Pad) {
+ d->applyIconScaleForPadMode();
+ }
}
QString NeptuneIconLabel::text() const
@@ -540,11 +642,12 @@ void NeptuneIconLabel::setAlignment(Qt::Alignment alignment)
Q_D(NeptuneIconLabel);
const int valign = alignment & Qt::AlignVertical_Mask;
const int halign = alignment & Qt::AlignHorizontal_Mask;
- const uint align = (valign ? valign : Qt::AlignVCenter) | (halign ? halign : Qt::AlignHCenter);
+ const Qt::Alignment align = (valign ? static_cast<Qt::Alignment>(valign) : Qt::AlignVCenter)
+ | (halign ? static_cast<Qt::Alignment>(valign) : Qt::AlignHCenter);
if (d->alignment == align)
return;
- d->alignment = static_cast<Qt::Alignment>(align);
+ d->alignment = align;
if (d->label) {
d->label->setVAlign(static_cast<QQuickText::VAlignment>(valign));
d->label->setHAlign(static_cast<QQuickText::HAlignment>(halign));
@@ -647,6 +750,7 @@ void NeptuneIconLabel::resetBottomPadding()
void NeptuneIconLabel::componentComplete()
{
Q_D(NeptuneIconLabel);
+
if (d->image)
completeComponent(d->image);
if (d->label)
@@ -659,7 +763,91 @@ void NeptuneIconLabel::geometryChanged(const QRectF &newGeometry, const QRectF &
{
Q_D(NeptuneIconLabel);
QQuickItem::geometryChanged(newGeometry, oldGeometry);
- d->layout();
+
+ //layout operates only by width and height, skip layout updates on rect x,y change
+ if (newGeometry.size() != oldGeometry.size()) {
+ d->layout();
+ }
+}
+
+void NeptuneIconLabel::onImageStatusChanged(QQuickImageBase::Status status)
+{
+ Q_D(NeptuneIconLabel);
+
+ if (status == QQuickImageBase::Ready) {
+ // When we create image object we don't know about it's pixel size until it is loaded
+ // We need image source pixel size to correctly display scaled image
+
+ // In Pad mode we scale sourceSize according to iconScale size = pixel size x iconScale
+ // In other modes we scale sourceSize to fit in desired iconRectWidth x iconRectHeight
+ if (d->iconFillMode == QQuickImage::Pad) {
+ d->applyIconScaleForPadMode();
+ } else if (d->iconRectWidth > 0.0 && d->iconRectHeight > 0.0) {
+ d->applyIconRect();
+ }
+ }
+}
+
+QQuickImage::FillMode NeptuneIconLabel::iconFillMode() const {
+ Q_D(const NeptuneIconLabel);
+
+ return d->iconFillMode;
}
+void NeptuneIconLabel::setIconFillMode(QQuickImage::FillMode mode) {
+ Q_D(NeptuneIconLabel);
+
+ if (d->iconFillMode == mode)
+ return;
+
+ d->iconFillMode = mode;
+
+ if (d->image && d->image->status() == QQuickImageBase::Ready) {
+ if (d->iconFillMode == QQuickImage::Pad) {
+ d->applyIconScaleForPadMode();
+ } else if (d->iconRectWidth > 0 && d->iconRectHeight > 0) {
+ d->applyIconRect();
+ }
+ }
+}
+
+void NeptuneIconLabel::setIconRectWidth(qreal width) {
+ Q_D(NeptuneIconLabel);
+
+ if (qFuzzyCompare(d->iconRectWidth, width))
+ return;
+
+ d->iconRectWidth = width;
+ if (d->image && d->image->status() == QQuickImageBase::Ready && d->iconRectHeight > 0.0
+ && d->iconFillMode != QQuickImage::Pad) {
+ d->applyIconRect();
+ }
+ Q_EMIT iconRectWidthChanged();
+}
+
+void NeptuneIconLabel::setIconRectHeight(qreal height) {
+ Q_D(NeptuneIconLabel);
+
+ if (qFuzzyCompare(d->iconRectHeight, height))
+ return;
+
+ d->iconRectHeight = height;
+ if (d->image && d->image->status() == QQuickImageBase::Ready && d->iconRectWidth > 0
+ && d->iconFillMode != QQuickImage::Pad) {
+ d->applyIconRect();
+ }
+ Q_EMIT iconRectHeightChanged();
+}
+
+qreal NeptuneIconLabel::iconRectWidth() const {
+ Q_D(const NeptuneIconLabel);
+
+ return d->iconRectWidth;
+}
+
+qreal NeptuneIconLabel::iconRectHeight() const {
+ Q_D(const NeptuneIconLabel);
+
+ return d->iconRectHeight;
+}
QT_END_NAMESPACE
diff --git a/plugins/controls/neptuneiconlabel.h b/plugins/controls/neptuneiconlabel.h
index b6c3af2d..18484bfe 100644
--- a/plugins/controls/neptuneiconlabel.h
+++ b/plugins/controls/neptuneiconlabel.h
@@ -35,6 +35,8 @@
#include <QtQuick/qquickitem.h>
#include <QtQuickControls2/private/qtquickcontrols2global_p.h>
#include <QtQuickTemplates2/private/qquickicon_p.h>
+#include <QtQuick/private/qquickimagebase_p.h>
+#include <QtQuick/private/qquickimage_p.h>
QT_BEGIN_NAMESPACE
@@ -56,6 +58,11 @@ class NeptuneIconLabel : public QQuickItem
Q_PROPERTY(qreal leftPadding READ leftPadding WRITE setLeftPadding RESET resetLeftPadding FINAL)
Q_PROPERTY(qreal rightPadding READ rightPadding WRITE setRightPadding RESET resetRightPadding FINAL)
Q_PROPERTY(qreal bottomPadding READ bottomPadding WRITE setBottomPadding RESET resetBottomPadding FINAL)
+ Q_PROPERTY(QQuickImage::FillMode iconFillMode READ iconFillMode WRITE setIconFillMode FINAL)
+ Q_PROPERTY(qreal iconRectWidth READ iconRectWidth WRITE setIconRectWidth
+ NOTIFY iconRectWidthChanged)
+ Q_PROPERTY(qreal iconRectHeight READ iconRectHeight WRITE setIconRectHeight
+ NOTIFY iconRectHeightChanged)
public:
enum Display {
@@ -69,6 +76,9 @@ public:
explicit NeptuneIconLabel(QQuickItem *parent = nullptr);
~NeptuneIconLabel();
+ QQuickImage::FillMode iconFillMode() const;
+ void setIconFillMode(QQuickImage::FillMode mode);
+
QQuickIcon icon() const;
void setIcon(const QQuickIcon &icon);
@@ -112,10 +122,23 @@ public:
void setBottomPadding(qreal padding);
void resetBottomPadding();
+ qreal iconRectWidth() const;
+ void setIconRectWidth(qreal width);
+
+ qreal iconRectHeight() const;
+ void setIconRectHeight(qreal height);
+
+Q_SIGNALS:
+ void iconRectWidthChanged();
+ void iconRectHeightChanged();
+
protected:
void componentComplete() override;
void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override;
+private Q_SLOTS:
+ void onImageStatusChanged(QQuickImageBase::Status);
+
private:
Q_DISABLE_COPY(NeptuneIconLabel)
Q_DECLARE_PRIVATE(NeptuneIconLabel)
diff --git a/plugins/controls/neptuneiconlabel_p.h b/plugins/controls/neptuneiconlabel_p.h
index d3ee90dd..ddd5ef53 100644
--- a/plugins/controls/neptuneiconlabel_p.h
+++ b/plugins/controls/neptuneiconlabel_p.h
@@ -35,6 +35,8 @@
#include <QtQuick/private/qquickitem_p.h>
#include <QtQuickControls2/private/qtquickcontrols2global_p.h>
#include <QtQuickTemplates2/private/qquickicon_p.h>
+#include <QtQuick/private/qquickimage_p.h>
+#include <QtQuick/private/qquickrectangle_p.h>
QT_BEGIN_NAMESPACE
@@ -91,6 +93,14 @@ public:
QQuickIcon icon;
QQuickIconImage *image;
QQuickMnemonicLabel *label;
+ QQuickImage::FillMode iconFillMode{QQuickImage::FillMode::Pad};
+ qreal iconRectWidth{0.0};
+ qreal iconRectHeight{0.0};
+
+private:
+ void applyIconScaleForPadMode();
+ void applyIconRect();
+ void applyIconSizeAndPosition(const QRectF &iconRect);
};
QT_END_NAMESPACE
diff --git a/plugins/eventslisteners/eventsListenersPlugin.cpp b/plugins/eventslisteners/eventsListenersPlugin.cpp
new file mode 100644
index 00000000..f7fc52fb
--- /dev/null
+++ b/plugins/eventslisteners/eventsListenersPlugin.cpp
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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
+**
+****************************************************************************/
+
+#include <QtQml/qqmlextensionplugin.h>
+#include <QtQml>
+
+#include "touchPointsTracer.h"
+
+class EventsListenersPlugin : public QQmlExtensionPlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
+public:
+ void registerTypes(const char *uri) override
+ {
+ Q_ASSERT(QLatin1String(uri) == QLatin1String("shared.com.luxoft.eventslisteners"));
+
+ qmlRegisterUncreatableType<TouchPointsTracer>(uri, 1, 0, "TouchPointsTracer"
+ , "TouchPointsTracer is an attached property");
+ }
+};
+
+#include "eventsListenersPlugin.moc"
diff --git a/plugins/eventslisteners/eventslisteners.pro b/plugins/eventslisteners/eventslisteners.pro
new file mode 100644
index 00000000..c3a53ac5
--- /dev/null
+++ b/plugins/eventslisteners/eventslisteners.pro
@@ -0,0 +1,13 @@
+TEMPLATE = lib
+TARGET = eventslistenersplugin
+QT += qml quick gui
+CONFIG += qt plugin c++11
+
+uri = com.luxoft.eventslisteners
+load(qmlplugin)
+
+SOURCES += \
+ eventsListenersPlugin.cpp
+
+HEADERS += \
+ touchPointsTracer.h
diff --git a/plugins/eventslisteners/qmldir b/plugins/eventslisteners/qmldir
new file mode 100644
index 00000000..57c26504
--- /dev/null
+++ b/plugins/eventslisteners/qmldir
@@ -0,0 +1,3 @@
+module shared.com.luxoft.eventslisteners
+plugin eventslistenersplugin
+
diff --git a/plugins/eventslisteners/touchPointsTracer.h b/plugins/eventslisteners/touchPointsTracer.h
new file mode 100644
index 00000000..a92323ac
--- /dev/null
+++ b/plugins/eventslisteners/touchPointsTracer.h
@@ -0,0 +1,115 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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 once
+
+#include <QtGlobal>
+#include <QObject>
+#include <QTouchEvent>
+#include <QMouseEvent>
+#include <QQmlEngine>
+
+#include <QDebug>
+class TouchPointsTracer : public QObject
+{
+ Q_OBJECT
+
+ Q_PROPERTY(QObject *target READ getTarget WRITE setTarget)
+public:
+ explicit TouchPointsTracer(QObject *parent = nullptr) :
+ QObject(parent)
+ , m_filterTouches(!qgetenv("SHOW_TOUCH_POINTS").compare(QByteArrayLiteral("yes")))
+ {}
+
+ static TouchPointsTracer *qmlAttachedProperties(QObject *object) {
+ return new TouchPointsTracer(object);
+ }
+
+ QObject *getTarget() const {
+ return m_currentTarget;
+ }
+
+ void setTarget(QObject *target) {
+ if (m_currentTarget) {
+ removeEventFilter(m_currentTarget);
+ }
+
+ m_currentTarget = target;
+ listenTo(target);
+ }
+
+ bool eventFilter(QObject *object, QEvent *event) override {
+ if (m_filterTouches) {
+ if (event->type() == QEvent::TouchBegin
+ || event->type() == QEvent::TouchEnd
+ || event->type() == QEvent::TouchUpdate) {
+ auto tEvent = static_cast<QTouchEvent *>(event);
+ const QList<QTouchEvent::TouchPoint> touchPoints = tEvent->touchPoints();
+ QVector<int> points;
+ points.reserve(touchPoints.size() * 2); // 2 int = point
+ for (auto && tp : touchPoints) {
+ QPoint point = tp.pos().toPoint();
+ points << point.x() << point.y();
+ }
+
+ if (!points.isEmpty())
+ emit touchPointsChanged(object, points);
+ } else if (event->type() == QEvent::MouseButtonPress
+ || event->type() == QEvent::MouseButtonRelease
+ || event->type() == QEvent::MouseMove)
+ {
+ auto mouseEvent = static_cast<QMouseEvent *>(event);
+ if (mouseEvent->buttons()) {
+ emit touchPointsChanged(object, {mouseEvent->pos().x(), mouseEvent->pos().y()});
+ }
+ }
+ }
+
+ return false;
+ }
+
+signals:
+ // QVector<int> is transparently supported by qml, we are trying to reduce data conversions
+ void touchPointsChanged(QObject *object, QVector<int> points);
+
+private:
+ QObject* m_currentTarget{nullptr};
+ bool m_filterTouches{false};
+
+ void listenTo(QObject *object) {
+ if (!object || !m_filterTouches)
+ return;
+
+ object->installEventFilter(this);
+ }
+};
+
+QML_DECLARE_TYPEINFO(TouchPointsTracer, QML_HAS_ATTACHED_PROPERTIES)
diff --git a/plugins/fileutils/fileUtils.cpp b/plugins/fileutils/fileUtils.cpp
new file mode 100644
index 00000000..204946a7
--- /dev/null
+++ b/plugins/fileutils/fileUtils.cpp
@@ -0,0 +1,45 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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
+**
+****************************************************************************/
+
+#include "fileUtils.h"
+
+#include <QUrl>
+#include <QFile>
+
+FileUtils::FileUtils(QObject *parent) : QObject(parent)
+{
+}
+
+bool FileUtils::existsFileFromUrl(const QString &fileUrl)
+{
+ QUrl url(fileUrl);
+ return QFile::exists(url.path());
+}
diff --git a/plugins/fileutils/fileUtils.h b/plugins/fileutils/fileUtils.h
new file mode 100644
index 00000000..0134abe8
--- /dev/null
+++ b/plugins/fileutils/fileUtils.h
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 IVI UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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 once
+#include <QObject>
+
+class FileUtils : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit FileUtils(QObject *parent = nullptr);
+
+ Q_INVOKABLE bool existsFileFromUrl(const QString &fileUrl);
+};
diff --git a/plugins/fileutils/fileUtilsPlugin.cpp b/plugins/fileutils/fileUtilsPlugin.cpp
new file mode 100644
index 00000000..810763ee
--- /dev/null
+++ b/plugins/fileutils/fileUtilsPlugin.cpp
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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
+**
+****************************************************************************/
+#include <QQmlExtensionPlugin>
+#include <QQmlEngine>
+
+#include "fileUtils.h"
+
+class FileUtilsPlugin : public QQmlExtensionPlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
+
+public:
+ void registerTypes(const char *uri) override
+ {
+ Q_ASSERT(uri == QLatin1String("shared.FileUtils"));
+ qmlRegisterSingletonType<FileUtils>(uri, 1, 0, "FileUtils",
+ [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject *{
+ Q_UNUSED(engine)
+ Q_UNUSED(scriptEngine)
+ auto fileUtils = new FileUtils;
+ return fileUtils;
+ });
+ }
+};
+
+#include "fileUtilsPlugin.moc"
diff --git a/plugins/fileutils/fileutils.pro b/plugins/fileutils/fileutils.pro
new file mode 100644
index 00000000..6ffebf26
--- /dev/null
+++ b/plugins/fileutils/fileutils.pro
@@ -0,0 +1,14 @@
+TEMPLATE = lib
+TARGET = fileutilsplugin
+QT += core qml
+CONFIG += qt plugin c++11
+
+SOURCES += \
+ fileUtils.cpp \
+ fileUtilsPlugin.cpp \
+
+HEADERS += \
+ fileUtils.h \
+
+uri = FileUtils
+load(qmlplugin)
diff --git a/plugins/fileutils/qmldir b/plugins/fileutils/qmldir
new file mode 100644
index 00000000..ecf1e579
--- /dev/null
+++ b/plugins/fileutils/qmldir
@@ -0,0 +1,2 @@
+module shared.FileUtils
+plugin fileutilsplugin
diff --git a/plugins/plugins.pro b/plugins/plugins.pro
index c8ebc14a..e3bb5b32 100644
--- a/plugins/plugins.pro
+++ b/plugins/plugins.pro
@@ -7,7 +7,9 @@ SUBDIRS = \
widgetgrid \
style \
systeminfo \
- com.pelagicore.map
+ eventslisteners \
+ com.pelagicore.map \
+ fileutils \
!isEmpty(SQUISH_PREFIX) {
SUBDIRS += squishhook
diff --git a/plugins/style/Style.cpp b/plugins/style/Style.cpp
index d2935c31..4a6d44a1 100644
--- a/plugins/style/Style.cpp
+++ b/plugins/style/Style.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 Luxoft Sweden AB
+** Copyright (C) 2019-2020 Luxoft Sweden AB
** Copyright (C) 2018 Pelagicore AG
** Contact: https://www.qt.io/licensing/
**
@@ -57,7 +57,7 @@ Style *Style::qmlAttachedProperties(QObject *object)
void Style::init()
{
m_theme = StyleDefaults::instance()->data().theme;
- m_accentColor = StyleDefaults::instance()->data().accentColor;
+ m_accentColor = StyleDefaults::instance()->dataFromTheme(m_theme).accentColor;
QQuickAttachedObject::init();
}
diff --git a/plugins/style/StyleData.h b/plugins/style/StyleData.h
index a812a328..177a67a3 100644
--- a/plugins/style/StyleData.h
+++ b/plugins/style/StyleData.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 Luxoft Sweden AB
+** Copyright (C) 2019-2020 Luxoft Sweden AB
** Copyright (C) 2018 Pelagicore AG
** Contact: https://www.qt.io/licensing/
**
@@ -37,9 +37,9 @@
struct StyleData
{
enum Theme { Light = 0, Dark = 1 } theme;
- QColor accentColor;
struct ThemeData {
+ QColor accentColor;
QColor backgroundColor;
QColor buttonColor;
QColor highlightedButtonColor;
diff --git a/plugins/style/StyleDefaults.cpp b/plugins/style/StyleDefaults.cpp
index a7a45a8c..3370d3c2 100644
--- a/plugins/style/StyleDefaults.cpp
+++ b/plugins/style/StyleDefaults.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 Luxoft Sweden AB
+** Copyright (C) 2019-2020 Luxoft Sweden AB
** Copyright (C) 2018 Pelagicore AG
** Contact: https://www.qt.io/licensing/
**
@@ -83,8 +83,6 @@ StyleDefaults::StyleDefaults()
CHECK_KEY("Theme")
m_data.theme = settings.value("Theme").toString() == QString("Light") ? StyleData::Light : StyleData::Dark;
- FETCH_COLOR(m_data.accentColor, "AccentColor")
-
QStringList themes = settings.childGroups();
if (themes.contains("Light")) {
@@ -102,6 +100,7 @@ StyleDefaults::StyleDefaults()
void StyleDefaults::loadTheme(StyleData::ThemeData &data, QSettings &settings)
{
+ FETCH_COLOR(data.accentColor, "AccentColor");
FETCH_COLOR(data.backgroundColor, "BackgroundColor");
FETCH_COLOR(data.buttonColor, "ButtonColor");
FETCH_COLOR(data.highlightedButtonColor, "HighlightedButtonColor");
diff --git a/plugins/systeminfo/systeminfo.cpp b/plugins/systeminfo/systeminfo.cpp
index 8a782572..249fea9f 100644
--- a/plugins/systeminfo/systeminfo.cpp
+++ b/plugins/systeminfo/systeminfo.cpp
@@ -36,6 +36,8 @@
#include <QSysInfo>
#include <QLibraryInfo>
#include <QtQml/qqmlinfo.h>
+#include <QtGui/QOpenGLContext>
+#include <QtGlobal>
#include "systeminfo.h"
@@ -89,15 +91,15 @@ void SystemInfo::init()
void SystemInfo::getAddress()
{
m_addressList.clear();
- for (const QNetworkInterface &interface : QNetworkInterface::allInterfaces()) {
- if (interface.flags().testFlag(QNetworkInterface::IsUp)
- && !interface.flags().testFlag(QNetworkInterface::IsLoopBack)
- && interface.type() != QNetworkInterface::InterfaceType::Unknown
- && interface.type() != QNetworkInterface::InterfaceType::Loopback
- && interface.type() != QNetworkInterface::InterfaceType::Virtual) {
- for (const QNetworkAddressEntry &entry : interface.addressEntries()) {
- if (interface.hardwareAddress() != QLatin1String("00:00:00:00:00:00")) {
- m_addressList.append(interface.name() + QLatin1String(" ") + entry.ip().toString() + QLatin1String(" ") + interface.hardwareAddress());
+ for (const QNetworkInterface &_interface : QNetworkInterface::allInterfaces()) {
+ if (_interface.flags().testFlag(QNetworkInterface::IsUp)
+ && !_interface.flags().testFlag(QNetworkInterface::IsLoopBack)
+ && _interface.type() != QNetworkInterface::InterfaceType::Unknown
+ && _interface.type() != QNetworkInterface::InterfaceType::Loopback
+ && _interface.type() != QNetworkInterface::InterfaceType::Virtual) {
+ for (const QNetworkAddressEntry &entry : _interface.addressEntries()) {
+ if (_interface.hardwareAddress() != QLatin1String("00:00:00:00:00:00")) {
+ m_addressList.append(_interface.name() + QLatin1String(" ") + entry.ip().toString() + QLatin1String(" ") + _interface.hardwareAddress());
emit addressListChanged();
}
}
@@ -144,6 +146,32 @@ void SystemInfo::getQtDiagInfo()
#endif
}
+bool SystemInfo::allow3dStudioPresentations()
+{
+#ifndef QT_NO_OPENGL
+ QOpenGLContext *globalShareContext = QOpenGLContext::globalShareContext();
+
+ if (globalShareContext && globalShareContext->isValid()) {
+ return (globalShareContext->isOpenGLES()
+ && globalShareContext->format().version() >= qMakePair(2,0))
+ || (!globalShareContext->isOpenGLES()
+ && globalShareContext->format().version() >= qMakePair(3,3));
+ }
+#endif
+
+ return false;
+}
+
+bool SystemInfo::allowOpenGLContent()
+{
+#ifndef QT_NO_OPENGL
+ QOpenGLContext *globalShareContext = QOpenGLContext::globalShareContext();
+ return globalShareContext && globalShareContext->isValid();
+#endif
+
+ return false;
+}
+
void SystemInfo::timerEvent(QTimerEvent *event)
{
Q_UNUSED(event);
@@ -307,6 +335,21 @@ QString SystemInfo::qtDiag() const
return m_qtDiagContents;
}
+QVariant SystemInfo::readEnvironmentVariable(const QString &name) const
+{
+ return qgetenv(name.toLocal8Bit());
+}
+
+bool SystemInfo::isEnvironmentVariableSet(const QString &name) const
+{
+ return !qgetenv(name.toLocal8Bit()).isNull();
+}
+
+bool SystemInfo::isEnvironmentVariableEmpty(const QString &name) const
+{
+ return qgetenv(name.toLocal8Bit()).isEmpty();
+}
+
void SystemInfo::classBegin()
{
getQtDiagInfo();
diff --git a/plugins/systeminfo/systeminfo.h b/plugins/systeminfo/systeminfo.h
index 97eb0e61..8d2506b2 100644
--- a/plugins/systeminfo/systeminfo.h
+++ b/plugins/systeminfo/systeminfo.h
@@ -54,6 +54,8 @@ class SystemInfo : public QObject, public QQmlParserStatus
Q_PROPERTY(QString kernelVersion READ kernelVersion CONSTANT)
Q_PROPERTY(QString qtVersion READ qtVersion CONSTANT)
Q_PROPERTY(QString qtDiag READ qtDiag NOTIFY qtDiagChanged)
+ Q_PROPERTY(bool allow3dStudioPresentations READ allow3dStudioPresentations CONSTANT)
+ Q_PROPERTY(bool allowOpenGLContent READ allowOpenGLContent CONSTANT)
public:
explicit SystemInfo(QObject *parent = nullptr);
@@ -68,6 +70,10 @@ public:
QString kernelVersion() const;
QString qtDiag() const;
+ Q_INVOKABLE QVariant readEnvironmentVariable(const QString &name) const;
+ Q_INVOKABLE bool isEnvironmentVariableSet(const QString &name) const;
+ Q_INVOKABLE bool isEnvironmentVariableEmpty(const QString &name) const;
+
public slots:
void init();
@@ -90,6 +96,9 @@ private slots:
private:
void getAddress();
void getQtDiagInfo();
+ bool allow3dStudioPresentations();
+ bool allowOpenGLContent();
+
QStringList m_addressList;
int m_timerId{0};
bool m_connected{false};
diff --git a/plugins/systeminfo/systeminfo.pro b/plugins/systeminfo/systeminfo.pro
index 9009f9c8..00b01f97 100644
--- a/plugins/systeminfo/systeminfo.pro
+++ b/plugins/systeminfo/systeminfo.pro
@@ -1,6 +1,6 @@
TEMPLATE = lib
TARGET = systeminfoplugin
-QT += qml quick network
+QT += gui qml quick network
CONFIG += qt plugin c++11
uri = com.pelagicore.systeminfo
diff --git a/settings_app_android.pro b/settings_app_android.pro
index 091601bf..1d3aba11 100644
--- a/settings_app_android.pro
+++ b/settings_app_android.pro
@@ -5,14 +5,28 @@ TEMPLATE = subdirs
include(config.pri)
SUBDIRS += \
- src/drivedata/frontend/frontend.pro \
- src/drivedata/backend/backend.pro \
- src/drivedata/qml_plugin/qml_plugin.pro \
- src/remotesettings/frontend/frontend.pro \
- src/remotesettings/backend/backend.pro \
- src/remotesettings/qml_plugin/qml_plugin.pro \
- src/remotesettings/app/app.pro
+ drivedata_frontend \
+ drivedata_backend \
+ drivedata_qml_plugin \
+ remotesettings_frontend \
+ remotesettings_backend \
+ remotesettings_qml_plugin \
+ remotesettings_app \
-CONFIG += ordered
+drivedata_frontend.file = src/drivedata/frontend/frontend.pro
+drivedata_backend.file = src/drivedata/backend/backend.pro
+drivedata_qml_plugin.file = src/drivedata/qml_plugin/qml_plugin.pro
+remotesettings_frontend.file = src/remotesettings/frontend/frontend.pro
+remotesettings_backend.file = src/remotesettings/backend/backend.pro
+remotesettings_qml_plugin.file = src/remotesettings/qml_plugin/qml_plugin.pro
+remotesettings_app.file = src/remotesettings/app/app.pro
-OTHER_FILES += src/remotesettings/settings.qface
+drivedata_backend.depends = drivedata_frontend
+drivedata_qml_plugin.depends = drivedata_frontend
+
+remotesettings_backend.depends = remotesettings_frontend
+remotesettings_qml_plugin.depends = remotesettings_frontend
+
+remotesettings_app.depends = remotesettings_frontend
+
+OTHER_FILES += src/remotesettings/remotesettings.qface
diff --git a/src/assets/styles/neptune/icons/delete-24px.svg b/src/assets/styles/neptune/icons/delete-24px.svg
new file mode 100644
index 00000000..804a2153
--- /dev/null
+++ b/src/assets/styles/neptune/icons/delete-24px.svg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d29bc3db62a2cb48e5ca1c0de4dee4b97583a1c32c2c6d65e61ad2305ed06d38
+size 2982
diff --git a/src/assets/styles/neptune/images/colorSelector/base_for_color_selector.svg b/src/assets/styles/neptune/images/colorSelector/base_for_color_selector.svg
new file mode 100644
index 00000000..010671bc
--- /dev/null
+++ b/src/assets/styles/neptune/images/colorSelector/base_for_color_selector.svg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a142e139ef85b0baf37f2d0482087c4767e435e1fc078dea2e2d19469d1bfcf0
+size 40077
diff --git a/src/connectivity/connectivity/connectivity.pro b/src/connectivity/connectivity/connectivity.pro
index c5c3018e..fd4d607f 100644
--- a/src/connectivity/connectivity/connectivity.pro
+++ b/src/connectivity/connectivity/connectivity.pro
@@ -9,6 +9,7 @@ QT_FOR_CONFIG += ivicore
QFACE_SOURCES = ../connectivity.qface
DESTDIR = $$LIB_DESTDIR
+DEFINES += QT_BUILD_CONNECTIVITY_LIB
include($$SOURCE_DIR/config.pri)
diff --git a/src/drivedata/backend/backend.pro b/src/drivedata/backend/backend.pro
index 053b5a98..7aa90cf2 100644
--- a/src/drivedata/backend/backend.pro
+++ b/src/drivedata/backend/backend.pro
@@ -1,5 +1,5 @@
TEMPLATE=lib
-TARGET = $$qtLibraryTarget(drivedata_backend_qtro)
+TARGET = $$qt5LibraryTarget(drivedata_backend_qtro, "plugins/qtivi/")
CONFIG += ivigenerator plugin
QT_FOR_CONFIG += ivicore
diff --git a/src/drivedata/drivedata-simulation-server/simulation.qml b/src/drivedata/drivedata-simulation-server/simulation.qml
index 35cbc125..2371a16c 100644
--- a/src/drivedata/drivedata-simulation-server/simulation.qml
+++ b/src/drivedata/drivedata-simulation-server/simulation.qml
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 Luxoft Sweden AB
+** Copyright (C) 2019-2020 Luxoft Sweden AB
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Neptune 3 UI.
@@ -55,7 +55,7 @@ Item {
speedTimer.start()
}
}
- running: backend.driveTrainState !== 2
+ running: backend.enableSimulation && backend.driveTrainState !== 2
}
property Timer simulationSetTimer: Timer {
@@ -76,7 +76,7 @@ Item {
}
}
repeat: true
- running: backend.driveTrainState === 2
+ running: backend.enableSimulation && backend.driveTrainState === 2
}
property Timer speedTimer: Timer {
@@ -89,7 +89,7 @@ Item {
backend.speed = backend.speed - 1;
}
}
- repeat: true
+ repeat: backend.enableSimulation
}
property Timer powerTimer: Timer {
@@ -102,7 +102,71 @@ Item {
}
}
repeat: true
- running: backend.driveTrainState === 2
+ running: backend.enableSimulation && backend.driveTrainState === 2
+ }
+
+ /*
+ One shot timer to have values initialized
+ */
+ property Timer initTimer: Timer {
+ interval: 2000
+ onTriggered: {
+ backend.lowBeamHeadlight = true;
+ backend.outsideTemperatureCelsius = 20.0;
+ backend.mileageKm = 8124;
+ backend.drivingModeRangeKm = 600;
+ backend.drivingModeECORangeKm = 720;
+ backend.navigationProgressPercents = 0.7;
+ backend.navigationRouteDistanceKm = 42;
+ }
+ repeat: false
+ running: true
+ }
+
+ /*
+ Telltales simulation
+ - left/right turn, lights are controlled manually
+ */
+ property Timer telltalesTimer: Timer {
+ interval: 3000
+ onTriggered: {
+ backend.stabilityControl = getNewTelltaleState();
+ backend.seatBeltNotFastened = getNewTelltaleState();
+ backend.ABSFailure = getNewTelltaleState();
+ backend.parkBrake = getNewTelltaleState();
+ backend.tyrePressureLow = getNewTelltaleState();
+ backend.brakeFailure = getNewTelltaleState();
+ backend.airbagFailure = getNewTelltaleState();
+ }
+ repeat: true
+ running: backend.enableSimulation
+ function getNewTelltaleState() {
+ return Math.round(Math.random());
+ }
+ }
+
+ /*
+ Lucee elements timer
+ */
+ property Timer luceeTimer: Timer {
+ interval: 2000
+ onTriggered: {
+ backend.mileageKm = backend.mileageKm + 0.2;
+
+ backend.drivingModeRangeKm = backend.drivingModeRangeKm - 0.2;
+ backend.drivingModeECORangeKm = backend.drivingModeRangeKm - 0.2;
+ if (backend.drivingModeRangeKm < 20) {
+ backend.drivingModeRangeKm = 1000;
+ backend.drivingModeECORangeKm = 1200;
+ }
+
+ backend.navigationProgressPercents = backend.navigationProgressPercents + 0.01
+ if (backend.navigationProgressPercents > 1.0) {
+ backend.navigationProgressPercents = 0.0;
+ }
+ }
+ repeat: true
+ running: backend.enableSimulation
}
}
}
diff --git a/src/drivedata/drivedata.qface b/src/drivedata/drivedata.qface
index 59033133..4473d122 100644
--- a/src/drivedata/drivedata.qface
+++ b/src/drivedata/drivedata.qface
@@ -2,6 +2,9 @@
module DriveData 1.0;
interface InstrumentCluster {
+ /* default value is false (in qface) */
+ bool enableSimulation;
+
/*
* In Km/H
*/
@@ -79,4 +82,15 @@ interface NavigationState {
real mapZoomLevel;
real mapTilt;
real mapBearing;
+ string nextTurn;
+ string nextTurnDistanceMeasuredIn;
+ real nextTurnDistance;
+
+ /**
+ * Contains route points to show a path on the map
+ * Points are stored as a list of coordinates: e.g.
+ * [pos1::QtPositioning.coordinate, pos2::QtPositioning.coordinate] is stored as
+ * [(pos1.x, pos1.y), (pos1.y , pos1.y)]
+ **/
+ var routePoints;
}
diff --git a/src/drivedata/drivedata.yaml b/src/drivedata/drivedata.yaml
index 1f7a73c2..c9338077 100644
--- a/src/drivedata/drivedata.yaml
+++ b/src/drivedata/drivedata.yaml
@@ -2,10 +2,18 @@ DriveData:
config_simulator:
simulationFile: "qrc:/plugin_resource/simulation.qml"
+DriveData.InstrumentCluster#enableSimulation:
+ config_simulator:
+ default: true
+
DriveData.InstrumentCluster#ePower:
config_simulator:
default: 100
+DriveData.InstrumentCluster#speed:
+ config_simulator:
+ default: 45
+
DriveData.InstrumentCluster#speedLimit:
config_simulator:
default: 50
diff --git a/src/neptune-cluster-app/ClusterRootStore.qml b/src/neptune-cluster-app/ClusterRootStore.qml
new file mode 100644
index 00000000..5f5c5f94
--- /dev/null
+++ b/src/neptune-cluster-app/ClusterRootStore.qml
@@ -0,0 +1,163 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.8
+import shared.com.pelagicore.remotesettings 1.0
+import shared.com.pelagicore.drivedata 1.0
+import shared.utils 1.0
+
+import "../apps/com.theqtcompany.cluster/stores" 1.0
+
+RootStoreInterface {
+ id: root
+
+ property bool devMode: false
+ onDevModeChanged: { Config.showCursorIndicator = root.devMode; }
+
+ readonly property InstrumentCluster clusterDataSource: InstrumentCluster {}
+ /*!
+ \qmlproperty UISettings ClusterStore::uiSettings
+ Needed here to get twentyFourHourTimeFormat
+ */
+ readonly property UISettings uiSettings: UISettings {}
+ // true if QtSafeRenderer is enabled
+
+ vehicleInterface: VehicleInterface {
+ speed: clusterDataSource.speed
+ speedLimit: clusterDataSource.speedLimit
+ speedCruise: clusterDataSource.speedCruise
+ driveTrainState: clusterDataSource.driveTrainState
+ ePower: clusterDataSource.ePower
+ drivingMode: clusterDataSource.drivingMode
+ drivingModeRangeKm: clusterDataSource.drivingModeRangeKm
+ drivingModeECORangeKm: clusterDataSource.drivingModeECORangeKm
+
+ mileage: localization.calculateDistanceValue(clusterDataSource.mileageKm)
+
+ lowBeamHeadlight: clusterDataSource.lowBeamHeadlight
+ highBeamHeadlight: clusterDataSource.highBeamHeadlight
+ fogLight: clusterDataSource.fogLight
+ stabilityControl: clusterDataSource.stabilityControl
+ seatBeltFasten: clusterDataSource.seatBeltNotFastened
+ leftTurn: clusterDataSource.leftTurn
+
+ rightTurn: clusterDataSource.rightTurn
+ absFailure: clusterDataSource.ABSFailure
+ parkBrake: clusterDataSource.parkBrake
+ tyrePressureLow: clusterDataSource.tyrePressureLow
+ brakeFailure: clusterDataSource.brakeFailure
+ airbagFailure: clusterDataSource.airbagFailure
+ }
+
+ behaviourInterface: BehaviourInterface {
+ Loader {
+ visible: false
+ source: "../apps/com.theqtcompany.cluster/helpers/Qt3DStudioAvailable.qml"
+ onLoaded: {
+ root.behaviourInterface.qt3DStudioAvailable = true
+ source = ""
+ }
+ }
+
+ threeDGauges: qt3DStudioAvailable && uiSettings.threeDGauges
+ hideGauges: uiSettings.hideGauges
+ navigationMode: uiSettings.navigationMode
+ }
+
+ externalDataInterface: ExternalDataInterface {
+ outsideTemperature: QtObject {
+ readonly property real value: clusterDataSource.outsideTemperatureCelsius
+
+ readonly property real minValue: -100
+ readonly property real maxValue: 100
+ readonly property real stepValue: 0.5
+ readonly property real localizedValue: localization.calculateUnitValue(value)
+ readonly property string valueString: Number(localizedValue).toLocaleString(Qt.locale(), 'f', 1)
+ readonly property string localizedUnits: root.localization.temperature
+ }
+
+ currentDate: new Date();
+ readonly property QtObject d_timer: Timer {
+ interval: 1000
+ repeat: true
+ running: true
+ onTriggered: parent.currentDate = new Date()
+ }
+
+ readonly property real navigationProgressPercents: clusterDataSource.navigationProgressPercents
+ readonly property real navigationRouteDistanceKm: clusterDataSource.navigationRouteDistanceKm
+ }
+
+
+ readonly property QtObject localization: QtObject {
+ property string mileageUnits: {
+ if (Qt.locale().measurementSystem === Locale.MetricSystem)
+ return qsTr("km")
+ else
+ return qsTr("mi")
+ }
+
+ readonly property string speedUnits: {
+ if (Qt.locale().measurementSystem === Locale.MetricSystem)
+ return qsTr("km/h")
+ else
+ return qsTr("mph")
+ }
+
+ readonly property string temperature: {
+ if (Qt.locale().measurementSystem === Locale.MetricSystem)
+ return qsTr("°C")
+ else
+ return qsTr("°F")
+ }
+
+ readonly property bool twentyFourHourTimeFormat: uiSettings.twentyFourHourTimeFormat
+
+ /*!
+ Convert distance from km to mi
+ */
+ function calculateDistanceValue(value) {
+ return Qt.locale().measurementSystem === Locale.MetricSystem
+ ? value
+ : value / 1.60934
+ }
+
+ /*!
+ Convert temperature from C to F
+ */
+ function calculateUnitValue(value) {
+ // Default value is the celsius
+ return Qt.locale().measurementSystem === Locale.MetricSystem
+ ? value
+ : Math.round(value * 1.8 + 32.0)
+ }
+ }
+}
diff --git a/src/neptune-cluster-app/Launcher.qml b/src/neptune-cluster-app/Launcher.qml
new file mode 100644
index 00000000..e31d3866
--- /dev/null
+++ b/src/neptune-cluster-app/Launcher.qml
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.12
+import QtQuick.Controls 2.5
+import Qt.labs.folderlistmodel 2.2
+
+import shared.Sizes 1.0
+
+import "../sysui/launcher" 1.0
+
+Item {
+ id: root
+
+ signal appClicked(var appUrl)
+
+ ButtonGroup {
+ id: buttonGroup
+ }
+
+ readonly property int buttonWidth: Sizes.dp(100)
+
+ ListView {
+ id: appsLauncher
+ interactive: false
+ LayoutMirroring.enabled: false
+ orientation: Qt.Horizontal
+ height: buttonWidth
+ width: (buttonWidth + spacing) * flModel.count - spacing
+ spacing: buttonWidth / 4
+ anchors.top: parent.top
+ anchors.topMargin: Sizes.dp(30)
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ model: FolderListModel {
+ id: flModel
+ showDirs: true
+ showDotAndDotDot: false
+ folder: "apps"
+ nameFilters: [ "*-ic" ]
+ }
+
+ delegate:
+ Item {
+ id: delegateRoot
+ width: buttonWidth
+ height: width
+
+ AppButton {
+ id: appButton
+ z: 40
+ ButtonGroup.group: buttonGroup
+ anchors.fill: parent
+ editModeBgOpacity: 0.0
+
+ icon.name: Qt.resolvedUrl("apps/" + fileName + '/' + 'icon.png')
+ gridOpen: false
+
+ onClicked: {
+ root.appClicked(Qt.resolvedUrl("apps/" + fileName + '/' + 'Main.qml'));
+ }
+ }
+ }
+ }
+}
diff --git a/src/neptune-cluster-app/MockedWindows.qml b/src/neptune-cluster-app/MockedWindows.qml
new file mode 100644
index 00000000..0ae38109
--- /dev/null
+++ b/src/neptune-cluster-app/MockedWindows.qml
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.12
+import QtQuick.Controls 2.12
+
+Item {
+ id: root
+
+ QtObject {
+ id: d
+ property string currentApp: ""
+ }
+
+ function runApp(appUrl) {
+ d.currentApp = appUrl;
+ for (var i = 0; i < runningApps.count; ++i) {
+ if (runningApps.get(i).appUrl === appUrl) {
+ return;
+ }
+ }
+
+ runningApps.append({"appUrl": appUrl});
+ }
+
+ ListModel {
+ id: runningApps
+ }
+
+ Repeater {
+ model: runningApps
+ delegate: Item {
+ width: root.width
+ height: root.height
+ opacity: Number(appUrl === d.currentApp)
+
+ Behavior on opacity {
+ NumberAnimation { duration: 300 }
+ }
+
+ Loader {
+ x: 0
+ y: 0
+ width: root.width
+ height: root.height
+ source: appUrl
+ }
+ }
+ }
+}
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/+lucee/icon.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/+lucee/icon.png
new file mode 100644
index 00000000..8df8de22
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/+lucee/icon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cff47f6c6ba5b27ceeb3fbe1a4aca8e04a572a802eaa9fc518c475c66121a726
+size 820
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/Main.qml b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/Main.qml
new file mode 100644
index 00000000..6fd94bf9
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/Main.qml
@@ -0,0 +1,45 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.13
+import QtQuick.Controls 2.2
+
+import "views" 1.0
+import "stores" 1.0
+
+Item {
+ id: root
+ VehicleICView {
+ id: vehicleView
+ anchors.fill: parent
+ store: VehicleStore {}
+ }
+}
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_background.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_background.png
new file mode 100644
index 00000000..688d76ac
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_background.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5dd6453804435baf851d413af4dbadcf7f66dfab2d27bbb76867b94235c9fdf9
+size 2152197
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_bodyVehicle.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_bodyVehicle.png
new file mode 100644
index 00000000..e073a734
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_bodyVehicle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1a7bae1ace4bb0aadb90c5f49cdc4adbbbd84eaccdc65c808a1225c86bb45635
+size 512144
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_leftDoorAlarmVehicle.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_leftDoorAlarmVehicle.png
new file mode 100644
index 00000000..f842d030
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_leftDoorAlarmVehicle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8a2a2d379b2c4b9b1f7d7a86a439d1903d6b34f98e0c3b67aa77b54a3d05ba80
+size 21785
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_leftDoorClosedVehicle.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_leftDoorClosedVehicle.png
new file mode 100644
index 00000000..9ee2ee68
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_leftDoorClosedVehicle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d3503b3e5e819e81acbd911dcd2fc52a8c0e4ca1e630cfc53f1ab4aa314f5fb6
+size 17413
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_leftDoorOpenedVehicle.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_leftDoorOpenedVehicle.png
new file mode 100644
index 00000000..38dbd90e
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_leftDoorOpenedVehicle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b9c6465128a67ad4b3d5f824360ade07f2b2e2435ee29656d8d711bfec5db4e6
+size 28896
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_leftDoorOpenedVehicleCarPart.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_leftDoorOpenedVehicleCarPart.png
new file mode 100644
index 00000000..78d39e32
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_leftDoorOpenedVehicleCarPart.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3d644a0d270aeb8b714ec4817e0c548d5dd135d65d5ddffc65677821429fbc3e
+size 16172
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_rightDoorAlarmVehicle.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_rightDoorAlarmVehicle.png
new file mode 100644
index 00000000..cf7f3df6
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_rightDoorAlarmVehicle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e904cc9f549160e0b1e0776b3dfca656747b2f79f50d10c80881b2be475b8641
+size 22053
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_rightDoorClosedVehicle.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_rightDoorClosedVehicle.png
new file mode 100644
index 00000000..395edf52
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_rightDoorClosedVehicle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d7f0e0601161026dc854e87468e2e1d8df59352e559c7bc3022de7d7aa7cb80f
+size 17402
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_rightDoorOpenedVehicle.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_rightDoorOpenedVehicle.png
new file mode 100644
index 00000000..61ab3378
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_rightDoorOpenedVehicle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:68e5a6494e414814a6df5ff4b7e12b66e111ebc50f76730637928a253e3badca
+size 21292
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_rightDoorOpenedVehicleCarPart.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_rightDoorOpenedVehicleCarPart.png
new file mode 100644
index 00000000..057baa0c
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_rightDoorOpenedVehicleCarPart.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4fef57fff1b565394e62f4cc2a546226823289c70ec7b25bb403d271b3b77513
+size 15670
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_roofAlarmVehicle.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_roofAlarmVehicle.png
new file mode 100644
index 00000000..c64a9897
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_roofAlarmVehicle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b50192635b09c8a1f7e45436f0c7003e969a76bf9cda8a58e3d57822cb5da1ec
+size 13721
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_roofClosedVehicle.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_roofClosedVehicle.png
new file mode 100644
index 00000000..58f9ba0d
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_roofClosedVehicle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7337bc5e8f9be8b0ce310a08d814c4c858f781f4f566f8d91bd312798d9f0527
+size 6878
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_roofOpenedVehicle.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_roofOpenedVehicle.png
new file mode 100644
index 00000000..90cdef53
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_roofOpenedVehicle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:396d051cc3b93ac735b74d3809e1844dca2464e226e355fe4d4e4667d9de2295
+size 11458
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_trunkAlarmVehicle.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_trunkAlarmVehicle.png
new file mode 100644
index 00000000..742c14e1
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_trunkAlarmVehicle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b91f424b814fa34ac49fd3b242e0a7fd99d83f0368c4f5cb9324bbd3898b16cc
+size 14342
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_trunkClosedVehicle.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_trunkClosedVehicle.png
new file mode 100644
index 00000000..740c87b8
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_trunkClosedVehicle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6d0051a37851f265c3e5b7584f23ea1fe64bc5a57ebc025e9e792ee52bd03fd6
+size 18389
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_trunkOpenedVehicle.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_trunkOpenedVehicle.png
new file mode 100644
index 00000000..b9784cc7
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/assets/images/ic_trunkOpenedVehicle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5697d8ae7158616b3d2f37a9728ac6a107d6073471db29c42aae5a43c4243028
+size 17216
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/helpers/pathsProvider.js b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/helpers/pathsProvider.js
new file mode 100644
index 00000000..6a5ecb73
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/helpers/pathsProvider.js
@@ -0,0 +1,36 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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 library
+
+function getImagePath(name) {
+ return Qt.resolvedUrl("../assets/images/" + name)
+}
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/helpers/qmldir b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/helpers/qmldir
new file mode 100644
index 00000000..f091a4dc
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/helpers/qmldir
@@ -0,0 +1,2 @@
+module helpers
+Paths 1.0 pathsProvider.js
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/icon.png b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/icon.png
new file mode 100644
index 00000000..bb54ede0
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/icon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fdf31c810a829c7e78728c82030a06c5bc2fd1f59bf12de8c89789a256a3187a
+size 2387
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/panels/Vehicle2DPanel.qml b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/panels/Vehicle2DPanel.qml
new file mode 100644
index 00000000..16c1ea27
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/panels/Vehicle2DPanel.qml
@@ -0,0 +1,266 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.9
+import QtGraphicalEffects 1.12
+
+import shared.animations 1.0
+import shared.Sizes 1.0
+
+import "../helpers" 1.0
+
+Item {
+ id: root
+
+ height: base.height
+ width: base.width
+
+ property bool trunkOpen: false
+ property bool leftDoorOpen: false
+ property bool rightDoorOpen: false
+ property bool roofOpen: false
+ property real speed: 0.0
+
+ SequentialAnimation {
+ running: speed > 0.0 && (trunkOpened || leftDoorOpened || roofOpen || rightDoorOpened)
+ loops: Animation.Infinite
+ PropertyAnimation {
+ targets: [sunroofAlarm, trunkAlarm, leftDooralarm, rightDooralarm]
+ properties: "opacity"
+ from: 0.0
+ to: 1.0
+ duration: 1000
+ }
+ PropertyAnimation {
+ targets: [sunroofAlarm, trunkAlarm, leftDooralarm, rightDooralarm]
+ properties: "opacity"
+ from: 1.0
+ to: 0.0
+ duration: 1000
+ }
+ }
+
+ Image {
+ anchors.topMargin: -Sizes.dp(68)
+ anchors.fill: parent
+ source: Paths.getImagePath("ic_background.png")
+ width: Sizes.dp(sourceSize.width)
+ height: Sizes.dp(sourceSize.height)
+ }
+
+ Item {
+ anchors.top: parent.top
+ anchors.topMargin: -Sizes.dp(300)
+ anchors.left: parent.left
+ anchors.leftMargin: Sizes.dp(670)
+ width: Sizes.dp(400)
+ height: Sizes.dp(500)
+ RadialGradient {
+ anchors.fill: parent
+ horizontalRadius: parent.width * .8
+ verticalRadius: parent.height * .8
+ angle: -20
+ gradient: Gradient {
+ GradientStop { position: 0.0; color: "white" }
+ GradientStop { position: 0.6; color: "transparent" }
+ }
+ }
+ }
+
+ Item {
+ anchors.top: parent.top
+ anchors.topMargin: -Sizes.dp(300)
+ anchors.right: parent.right
+ anchors.rightMargin: Sizes.dp(670)
+ width: Sizes.dp(400)
+ height: Sizes.dp(500)
+ RadialGradient {
+ anchors.fill: parent
+ horizontalRadius: parent.width * .8
+ verticalRadius: parent.height * .8
+ angle: 20
+ gradient: Gradient {
+ GradientStop { position: 0.0; color: "white" }
+ GradientStop { position: 0.6; color: "transparent" }
+ }
+ }
+ }
+
+ Image {
+ id: base
+ anchors.fill: parent
+ source: Paths.getImagePath("ic_bodyVehicle.png")
+ width: Sizes.dp(sourceSize.width)
+ height: Sizes.dp(sourceSize.height)
+ }
+
+ Image {
+ anchors.fill: parent
+ source: Paths.getImagePath("ic_roofClosedVehicle.png")
+ width: Sizes.dp(sourceSize.width)
+ height: Sizes.dp(sourceSize.height)
+ visible: sunroofOpened.opacity !== 1.0
+ }
+
+ Image {
+ id: sunroofOpened
+
+ anchors.fill: parent
+ source: Paths.getImagePath("ic_roofOpenedVehicle.png")
+ width: Sizes.dp(sourceSize.width)
+ height: Sizes.dp(sourceSize.height)
+ opacity: root.roofOpen ? 1.0 : 0.0
+ Behavior on opacity { DefaultNumberAnimation {} }
+ }
+
+ Image {
+ id: sunroofAlarm
+
+ anchors.fill: parent
+ source: Paths.getImagePath("ic_roofAlarmVehicle.png")
+ visible: roofOpen && root.speed > 0
+ width: Sizes.dp(sourceSize.width)
+ height: Sizes.dp(sourceSize.height)
+ }
+
+ Image {
+ id: leftDoor
+
+ anchors.fill: parent
+ source: Paths.getImagePath("ic_leftDoorClosedVehicle.png")
+ width: Sizes.dp(sourceSize.width)
+ height: Sizes.dp(sourceSize.height)
+ visible: root.leftDoorOpen ? 0.0 : 1.0
+ }
+
+ Image {
+ id: leftDoorOpenedCarPart
+
+ anchors.fill: parent
+ source: Paths.getImagePath("ic_leftDoorOpenedVehicleCarPart.png")
+ width: Sizes.dp(sourceSize.width)
+ height: Sizes.dp(sourceSize.height)
+ visible: root.leftDoorOpen ? 1.0 : 0.0
+ }
+
+ Image {
+ id: leftDoorOpened
+
+ anchors.fill: parent
+ source: Paths.getImagePath("ic_leftDoorOpenedVehicle.png")
+ width: Sizes.dp(sourceSize.width)
+ height: Sizes.dp(sourceSize.height)
+ opacity: root.leftDoorOpen ? 1.0 : 0.0
+ Behavior on opacity { DefaultNumberAnimation {} }
+ }
+
+ Image {
+ id: leftDooralarm
+
+ anchors.fill: parent
+ source: Paths.getImagePath("ic_leftDoorAlarmVehicle.png")
+ visible: leftDoorOpen && root.speed > 0
+ width: Sizes.dp(sourceSize.width)
+ height: Sizes.dp(sourceSize.height)
+ }
+
+ Image {
+ id: rightDoor
+
+ anchors.fill: parent
+ source: Paths.getImagePath("ic_rightDoorClosedVehicle.png")
+ width: Sizes.dp(sourceSize.width)
+ height: Sizes.dp(sourceSize.height)
+ visible: root.rightDoorOpen ? 0.0 : 1.0
+ }
+
+ Image {
+ id: rightDoorOpenedCarPart
+
+ anchors.fill: parent
+ source: Paths.getImagePath("ic_rightDoorOpenedVehicleCarPart.png")
+ width: Sizes.dp(sourceSize.width)
+ height: Sizes.dp(sourceSize.height)
+ visible: root.rightDoorOpen ? 1.0 : 0.0
+ }
+
+ Image {
+ id: rightDoorOpened
+
+ anchors.fill: parent
+ source: Paths.getImagePath("ic_rightDoorOpenedVehicle.png")
+ width: Sizes.dp(sourceSize.width)
+ height: Sizes.dp(sourceSize.height)
+ opacity: root.rightDoorOpen ? 1.0 : 0.0
+ Behavior on opacity { DefaultNumberAnimation {} }
+ }
+
+ Image {
+ id: rightDooralarm
+
+ anchors.fill: parent
+ source: Paths.getImagePath("ic_rightDoorAlarmVehicle.png")
+ visible: rightDoorOpen && root.speed > 0
+ width: Sizes.dp(sourceSize.width)
+ height: Sizes.dp(sourceSize.height)
+ }
+
+ Image {
+ id: trunk
+
+ anchors.fill: parent
+ source: Paths.getImagePath("ic_trunkClosedVehicle.png")
+ width: Sizes.dp(sourceSize.width)
+ height: Sizes.dp(sourceSize.height)
+ visible: trunkOpened.opacity !== 1.0
+ }
+
+ Image {
+ id: trunkOpened
+
+ anchors.fill: parent
+ source: Paths.getImagePath("ic_trunkOpenedVehicle.png")
+ width: Sizes.dp(sourceSize.width)
+ height: Sizes.dp(sourceSize.height)
+ opacity: root.trunkOpen ? 1.0 : 0.0
+ Behavior on opacity { DefaultNumberAnimation {} }
+ }
+
+ Image {
+ id: trunkAlarm
+
+ anchors.fill: parent
+ source: Paths.getImagePath("ic_trunkAlarmVehicle.png")
+ visible: trunkOpen && root.speed > 0
+ width: Sizes.dp(sourceSize.width)
+ height: Sizes.dp(sourceSize.height)
+ }
+}
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/panels/qmldir b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/panels/qmldir
new file mode 100644
index 00000000..99a9629b
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/panels/qmldir
@@ -0,0 +1 @@
+Vehicle2DPanel 1.0 Vehicle2DPanel.qml
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/stores/VehicleStore.qml b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/stores/VehicleStore.qml
new file mode 100644
index 00000000..b02850a2
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/stores/VehicleStore.qml
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Copyright (C) 2018 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.8
+import shared.com.pelagicore.remotesettings 1.0
+import shared.com.pelagicore.drivedata 1.0
+
+
+QtObject {
+ id: root
+
+ property bool leftDoorOpened: false
+ property bool rightDoorOpened: false
+ property bool trunkOpened: false
+ property real roofOpenProgress: 0.0
+ property real speed: clusterSettings.speed
+
+ readonly property UISettings uiSettings: UISettings {
+ onDoor1OpenChanged: {
+ root.leftDoorOpened = uiSettings.door1Open
+ }
+ onDoor2OpenChanged: {
+ root.rightDoorOpened = uiSettings.door2Open
+ }
+ onTrunkOpenChanged: {
+ root.trunkOpened = uiSettings.trunkOpen
+ }
+ onRoofOpenProgressChanged: {
+ root.roofOpenProgress = uiSettings.roofOpenProgress
+ }
+ }
+
+ readonly property InstrumentCluster clusterSettings: InstrumentCluster {}
+}
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/stores/qmldir b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/stores/qmldir
new file mode 100644
index 00000000..213b520f
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/stores/qmldir
@@ -0,0 +1 @@
+VehicleStore 1.0 VehicleStore.qml
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/views/VehicleICView.qml b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/views/VehicleICView.qml
new file mode 100644
index 00000000..0b58a503
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/views/VehicleICView.qml
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.2
+
+import shared.Sizes 1.0
+
+import "../panels" 1.0
+import "../stores" 1.0
+
+Item {
+ id: root
+
+ property VehicleStore store
+
+ Vehicle2DPanel {
+ anchors.top: root.top
+ anchors.topMargin: Sizes.dp(720 - 652)
+ anchors.left: root.left
+ anchors.right: root.right
+ height: Sizes.dp(652)
+
+ leftDoorOpen: root.store.leftDoorOpened
+ rightDoorOpen: root.store.rightDoorOpened
+ trunkOpen: root.store.trunkOpened
+ roofOpen: root.store.roofOpenProgress == 1.0
+ speed: store.speed
+ }
+}
diff --git a/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/views/qmldir b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/views/qmldir
new file mode 100644
index 00000000..e5d545b0
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.luxoft.vehicle-ic/views/qmldir
@@ -0,0 +1 @@
+VehicleICView 1.0 VehicleICView.qml
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/+lucee/icon.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/+lucee/icon.png
new file mode 100644
index 00000000..9b4fe494
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/+lucee/icon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4aba024d537ac6325b36c714b04bf71d54f65e731b831193c4a63eb71ba7ada1
+size 756
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/Main.qml b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/Main.qml
new file mode 100644
index 00000000..ac56bd47
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/Main.qml
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.Controls 2.2
+
+import QtQuick 2.9
+import QtPositioning 5.9
+
+import shared.com.pelagicore.map 1.0
+import shared.utils 1.0
+import shared.Style 1.0
+import shared.Sizes 1.0
+
+import "views" 1.0
+import "stores" 1.0
+
+Item {
+ MapStore {
+ id: store
+ }
+
+ // used for copying the offline DB
+ readonly property var _mapsHelper: MapsHelper {
+ appPath: Qt.resolvedUrl("./")
+
+ onAppPathChanged: {
+ if (appPath !== "") {
+ initMap("ic");
+ }
+ }
+ }
+
+ ICMapView {
+ id: icMapView
+ anchors.fill: parent
+ mapPlugin: store.mapPlugin
+ mapCenter: store.mapCenter
+ mapZoomLevel: store.mapZoomLevel
+ mapTilt: store.mapTilt
+ mapBearing: store.mapBearing
+ activeMapType: Style.theme === Style.Light ?
+ store.getMapType(icMapView.mapReady, store.defaultLightThemeId)
+ : store.getMapType(icMapView.mapReady, store.defaultDarkThemeId);
+
+ nextTurnDistanceMeasuredIn: store.nextTurnDistanceMeasuredIn
+ nextTurnDistance: store.nextTurnDistance
+ naviGuideDirection: store.naviGuideDirection
+
+ onMapReadyChanged: {
+ store.getAvailableMapsAndLocation(icMapView.mapReady, icMapView.supportedMapTypes);
+ }
+
+ Connections {
+ target: store
+ function onNavigationDemoActiveChanged() {
+ if (store.navigationDemoActive) {
+ icMapView.path = store.routePoints;
+ icMapView.state = "demo_driving";
+ } else {
+ icMapView.state = "initial";
+ }
+ }
+ }
+ }
+}
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_bear_l-dark.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_bear_l-dark.png
new file mode 100644
index 00000000..d5383c84
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_bear_l-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:da6621b5650fc38d61af05b7b5824d733403a6caed69012124a4c78a541907f0
+size 870
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_bear_l.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_bear_l.png
new file mode 100644
index 00000000..788595fd
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_bear_l.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:445d12de0c8e036abc18343f1fa1e34cd2cff0f2f012a3c7256ddd7e2318431b
+size 923
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_bear_r-dark.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_bear_r-dark.png
new file mode 100644
index 00000000..3ded2531
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_bear_r-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ec067d873d75de30164b07de9d30e139220352754ba07507638300b04d838a02
+size 878
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_bear_r.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_bear_r.png
new file mode 100644
index 00000000..11d61ceb
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_bear_r.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3fec1e3bb182bb8801b3f98d8adb18c3af250833de5098ed23b05f135c24830d
+size 938
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_hard_l-dark.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_hard_l-dark.png
new file mode 100644
index 00000000..2b90181e
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_hard_l-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a226b2b445670415228fcd036121673aac79b0d04b903fe5f848a34d6948130b
+size 1113
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_hard_l.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_hard_l.png
new file mode 100644
index 00000000..e7a94997
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_hard_l.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:03d245a4a5b2b9a3ed1e0203637163f10d8ee434338ef382c42904522b84994f
+size 1167
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_hard_r-dark.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_hard_r-dark.png
new file mode 100644
index 00000000..51f7365d
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_hard_r-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1eb11f5af439d5ca8f3ac483d9dbeaa37e917ce90ebe789f130fc74df65fb84d
+size 1057
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_hard_r.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_hard_r.png
new file mode 100644
index 00000000..025190ac
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_hard_r.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bbeace26bdc407f07485650b939f256af549b65bf4d9779e87176085d0840a3c
+size 1096
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_left-dark.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_left-dark.png
new file mode 100644
index 00000000..ce132b37
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_left-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2b178943f15563fdcf9bb4c246308d7981ebff6450f5f8a4f4b8bbc285139348
+size 848
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_left.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_left.png
new file mode 100644
index 00000000..642feb9f
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_left.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4c581d4e99b5a60f33519fbcd8ef9172a294e4628287fb3735427e61aa26dd5e
+size 895
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_light_left-dark.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_light_left-dark.png
new file mode 100644
index 00000000..6f30cddf
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_light_left-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:85b7b65fc75cc448610ea57ab618cf4fdd1a36ddef7bb2108def83e27e4b7f9f
+size 1090
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_light_left.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_light_left.png
new file mode 100644
index 00000000..ac4d8bc8
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_light_left.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fd9b7c13e6c5820fcef132f957a053a7d33aeb75f94754963aae8ddd77059d73
+size 1142
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_light_right-dark.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_light_right-dark.png
new file mode 100644
index 00000000..ebc90038
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_light_right-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2be3e5a99c79af84addf4030838a6bfc1d9a141c316bce125f7b9cf2fdaf03da
+size 1113
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_light_right.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_light_right.png
new file mode 100644
index 00000000..70b9eaed
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_light_right.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1a26eb7dae93ff7ef4d320bb5d3f54e276ab45c0fb25f7af0f82e70689d5299c
+size 1179
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_right-dark.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_right-dark.png
new file mode 100644
index 00000000..8866c5b7
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_right-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c8eed602798517d3f439512bb3cc281deac2b5387e0573c2da9449727aee0056
+size 799
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_right.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_right.png
new file mode 100644
index 00000000..564e8832
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_right.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0578ca0818dce6e8c9a775a8c1f49cbd825d2eea9e1082b466006e3904a201bf
+size 847
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_straight-dark.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_straight-dark.png
new file mode 100644
index 00000000..218c6a76
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_straight-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:694337b302e02615c664884fa0021c448bb45d036df3d42a58b1b9bf947f6400
+size 379
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_straight.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_straight.png
new file mode 100644
index 00000000..84946dc3
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_straight.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a48d636e373e12d7de40535ff5743cfd8f36f37b374d6dd401b312b54e52090f
+size 427
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_uturn_l-dark.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_uturn_l-dark.png
new file mode 100644
index 00000000..1f83fe92
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_uturn_l-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0b6468cd07a8d8bc8cc3b3d0b7049bb8b97a3351eef1a872531702db81ff09e1
+size 1283
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_uturn_l.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_uturn_l.png
new file mode 100644
index 00000000..2554bf45
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_uturn_l.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0488de2c6e86dabdc7c4878863221730558b836eb9d5d0073a1c37e997797ef0
+size 1348
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_uturn_r-dark.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_uturn_r-dark.png
new file mode 100644
index 00000000..110c55a4
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_uturn_r-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a86f2f40fbb40a701d7135e3a302d6464893d9c84ffee6ff97109f63c9dccf18
+size 1324
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_uturn_r.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_uturn_r.png
new file mode 100644
index 00000000..2b58ba7e
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/nav_uturn_r.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b981cc2e4515117cf75b4429c617d8690240cd9084977bcea08c08862d006f11
+size 1352
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/pin-destination.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/pin-destination.png
new file mode 100644
index 00000000..56795361
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/pin-destination.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:965a2a35819e13e25364dc621b8228488861f367da7b37afe470422d991bbf9e
+size 7558
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/pin-your-position.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/pin-your-position.png
new file mode 100644
index 00000000..f17de750
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/assets/pin-your-position.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:936b2c29a56aff78c225360aae06109ae7ac57a0ed2875873405b1be9d9d3ec1
+size 6154
diff --git a/sysui/launcher/+lucee/HomeButton.qml b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/helpers/helper.js
index a73e97b3..a45f4bdd 100644
--- a/sysui/launcher/+lucee/HomeButton.qml
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/helpers/helper.js
@@ -29,12 +29,9 @@
** SPDX-License-Identifier: GPL-3.0
**
****************************************************************************/
+.import shared.Style 1.0 as Style
-import QtQuick 2.6
-import QtQuick.Controls 2.2
-import shared.Style 1.0
-
-ToolButton {
- checkable: false
- icon.color: (checked || highlighted) ? Style.accentColor : "white"
+function localAsset(asset, theme) {
+ var themeStr = theme === Style.Style.Dark ? "-dark" : "";
+ return "../assets/" + asset + themeStr + '.png'
}
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/helpers/qmldir b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/helpers/qmldir
new file mode 100644
index 00000000..8671f1d9
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/helpers/qmldir
@@ -0,0 +1,2 @@
+module helpers
+Helper 1.0 helper.js
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/icon.png b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/icon.png
new file mode 100644
index 00000000..807797da
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/icon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5be35d0a4dab322c2d3238ccf3dd74995042ed42fa309e4d85645ff1bc0e67a0
+size 857
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/maps/mapboxgl.db b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/maps/mapboxgl.db
new file mode 100644
index 00000000..7291d76e
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/maps/mapboxgl.db
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:67d18923a064b1102451e864010b793a412b339d7d38682abd47a5641e4fa3ca
+size 52367360
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/stores/MapStore.qml b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/stores/MapStore.qml
new file mode 100644
index 00000000..54659583
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/stores/MapStore.qml
@@ -0,0 +1,140 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Copyright (C) 2018 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.8
+import QtPositioning 5.9
+import QtLocation 5.9
+import Qt.labs.platform 1.0
+import shared.utils 1.0
+
+import shared.com.pelagicore.remotesettings 1.0
+import shared.com.pelagicore.drivedata 1.0
+
+QtObject {
+ id: root
+
+ property var mapCenter: QtPositioning.coordinate(48.135771, 11.574052) // Munich
+ readonly property string defaultLightThemeId: "mapbox://styles/qtauto/cjcm1by3q12dk2sqnquu0gju9"
+ readonly property string defaultDarkThemeId: "mapbox://styles/qtauto/cjcm1czb812co2sno1ypmp1r8"
+
+ function getAvailableMapsAndLocation(mapReady, supportedMapTypes) {
+ if (mapReady) {
+ mapTypeModel.clear();
+ console.info("Supported map types:");
+ for (var i = 0; i < supportedMapTypes.length; i++) {
+ var map = supportedMapTypes[i];
+ mapTypeModel.append({"name": map.name, "data": map}) // fill the map type model
+ console.info("\t", map.name, ", description:", map.description
+ , ", style:", map.style, ", night mode:", map.night);
+ }
+ }
+ }
+
+ function getMapType(mapBoxPanelReady, name) {
+ if (!mapBoxPanelReady || !mapTypeModel.count) {
+ return
+ }
+ for (var i = 0; i < mapTypeModel.count; i++) {
+ var map = mapTypeModel.get(i);
+ if (map && map.name === name) {
+ return map.data;
+ }
+ }
+ }
+
+ function createRouteFromRaw(rawPoints) {
+ var routePath = [];
+ if (!!rawPoints) {
+ for (var i=0; i < rawPoints.length; ++i) {
+ routePath.push(QtPositioning.coordinate(rawPoints[i][0], rawPoints[i][1]));
+ }
+ }
+
+ return routePath;
+ }
+
+ // lists the various map styles (including the custom ones); filled in Map.onMapReadyChanged
+ readonly property ListModel mapTypeModel: ListModel { }
+
+ readonly property Plugin mapPlugin: Plugin {
+ preferred: ["mapboxgl", "osm"]
+ locales: Config.languageLocale
+
+ readonly property string cacheDirUrl: {
+ StandardPaths.writableLocation(StandardPaths.CacheLocation) + "/ic";
+ }
+
+ // OSM Plugin Parameters
+ PluginParameter { name: "osm.useragent"; value: "Neptune UI" }
+
+ // Mapbox Plugin Parameters
+ PluginParameter {
+ name: "mapboxgl.access_token"
+ value: "pk.eyJ1IjoicXRhdXRvIiwiYSI6ImNqY20wbDZidzBvcTQyd3J3NDlkZ21jdjUifQ"
+ +".4KYDlP7UmQEVPYffr6VuVQ"
+ }
+ PluginParameter {
+ name: "mapboxgl.mapping.additional_style_urls"
+ value: [root.defaultLightThemeId, root.defaultDarkThemeId].join(",")
+ }
+
+ // Offline maps support
+ PluginParameter {
+ name: "mapboxgl.mapping.cache.size";
+ value: "50 MiB"
+ }
+ PluginParameter {
+ name: "mapboxgl.mapping.cache.directory";
+ value: mapPlugin.cacheDirUrl.toString().substring(mapPlugin.cacheDirUrl.indexOf(':')+1)
+ }
+ }
+
+ readonly property NavigationState naviState: NavigationState {
+ id: naviState
+ onMapCenterChanged: {
+ if (naviState.mapCenter) {
+ root.mapCenter =
+ QtPositioning.coordinate(naviState.mapCenter[0], naviState.mapCenter[1]);
+ }
+ }
+ onRoutePointsChanged: root.routePoints = createRouteFromRaw(naviState.routePoints);
+ }
+
+ property var routePoints: [];
+ property bool navigationDemoActive: routePoints.length > 0;
+ property alias mapZoomLevel: naviState.mapZoomLevel;
+ property alias mapTilt: naviState.mapTilt;
+ property alias mapBearing: naviState.mapBearing;
+ property alias naviGuideDirection: naviState.nextTurn;
+ property alias nextTurnDistanceMeasuredIn: naviState.nextTurnDistanceMeasuredIn;
+ property alias nextTurnDistance: naviState.nextTurnDistance;
+}
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/stores/qmldir b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/stores/qmldir
new file mode 100644
index 00000000..ff52f7a6
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/stores/qmldir
@@ -0,0 +1 @@
+MapStore 1.0 MapStore.qml
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/views/ICMapView.qml b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/views/ICMapView.qml
new file mode 100644
index 00000000..111259aa
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/views/ICMapView.qml
@@ -0,0 +1,188 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Copyright (C) 2018 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.10
+import QtLocation 5.9
+import QtPositioning 5.14
+import QtQuick.Controls 2.13
+
+import shared.animations 1.0
+import shared.Style 1.0
+import shared.Sizes 1.0
+
+import "../helpers" 1.0
+
+Item {
+ id: root
+
+ property alias mapCenter: mainMap.center
+ property alias mapZoomLevel: mainMap.zoomLevel
+ property alias mapTilt: mainMap.tilt
+ property alias mapBearing: mainMap.bearing
+ property alias mapReady: mainMap.mapReady
+ property alias activeMapType: mainMap.activeMapType
+ property alias supportedMapTypes: mainMap.supportedMapTypes
+ property var path
+ property var mapPlugin
+
+
+ property string nextTurnDistanceMeasuredIn
+ property real nextTurnDistance
+ property string naviGuideDirection
+
+ state: "initial"
+ states: [
+ State {
+ // just a map w/o any additional items in it
+ name: "initial"
+ PropertyChanges {
+ target: posMarker
+ coordinate: QtPositioning.coordinate()
+ rotation: 0.0
+ visible: false
+ }
+ PropertyChanges {
+ target: destMarker
+ visible: false
+ coordinate: QtPositioning.coordinate()
+ }
+ PropertyChanges {
+ target: pathView
+ visible: false
+ path: []
+ }
+ },
+ State {
+ name: "demo_driving"
+ PropertyChanges {
+ target: posMarker
+ coordinate: root.mapCenter
+ rotation: 0.0
+ visible: true
+ }
+ PropertyChanges {
+ target: destMarker
+ visible: true
+ coordinate: root.path[root.path.length - 1]
+ }
+ PropertyChanges {
+ target: pathView
+ visible: true
+ path: root.path
+ }
+ PropertyChanges {
+ target: instructions
+ visible: root.naviGuideDirection !== ""
+ }
+ }
+ ]
+
+ Map {
+ id: mainMap
+ anchors.fill: parent
+ enabled: false
+ Behavior on tilt { DefaultSmoothedAnimation {} }
+ zoomLevel: 10
+ plugin: root.mapPlugin
+ copyrightsVisible: false
+
+ MapPolyline {
+ id: pathView
+ line.color: Style.accentColor
+ line.width: Sizes.dp(8)
+ smooth: true
+ opacity: Style.opacityHigh
+ }
+
+ MapQuickItem {
+ id: destMarker
+ anchorPoint: Qt.point(markerImage.width * 0.5, markerImage.height * 0.8)
+ sourceItem: Image {
+ id: markerImage
+ source: Qt.resolvedUrl("../assets/pin-destination.png")
+ width: Sizes.dp(69.5) // half size of the source
+ height: Sizes.dp(80.5)
+ }
+ }
+
+ Item {
+ id: instructions
+ visible: false
+ anchors.top: posMarker.bottom
+ anchors.topMargin: Sizes.dp(100)
+ anchors.horizontalCenter: posMarker.horizontalCenter
+ width: Sizes.dp(660)
+ height: Sizes.dp(100)
+
+ Rectangle {
+ anchors.fill: parent
+ opacity: 0.5
+ color: Style.theme === Style.Dark ? "black" : "white"
+ radius: 10
+ }
+
+ Label {
+ width: Sizes.dp(400)
+ height: Sizes.dp(100)
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.left: parent.left
+ anchors.leftMargin: Sizes.dp(30)
+ opacity: 0.9
+ font.pixelSize: Sizes.fontSizeXL
+ font.bold: true
+ verticalAlignment: Text.AlignVCenter
+ text: qsTr("Next turn: ") + root.nextTurnDistance
+ + " " + root.nextTurnDistanceMeasuredIn
+ }
+
+ Image {
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.right: parent.right
+ anchors.rightMargin: Sizes.dp(30)
+ source: root.naviGuideDirection !== ""
+ ? Helper.localAsset(root.naviGuideDirection, Style.theme)
+ : ""
+ }
+ }
+
+ MapQuickItem {
+ id: posMarker
+ anchorPoint: Qt.point(posImage.width * 0.5, posImage.height * 0.5)
+ sourceItem: Image {
+ id: posImage
+ source: Qt.resolvedUrl("../assets/pin-your-position.png")
+ width: Sizes.dp(58) // half size of the source
+ height: Sizes.dp(67.5)
+ }
+ }
+ }
+}
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.map-ic/views/qmldir b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/views/qmldir
new file mode 100644
index 00000000..1f059387
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.map-ic/views/qmldir
@@ -0,0 +1 @@
+ICMapView 1.0 ICMapView.qml
diff --git a/sysui/launcher/HomeButton.qml b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/Main.qml
index 2132f7e0..89acf5d7 100644
--- a/sysui/launcher/HomeButton.qml
+++ b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/Main.qml
@@ -1,7 +1,6 @@
/****************************************************************************
**
** Copyright (C) 2019 Luxoft Sweden AB
-** Copyright (C) 2018 Pelagicore AG
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Neptune 3 UI.
@@ -30,23 +29,19 @@
**
****************************************************************************/
-import QtQuick 2.6
+import QtQuick 2.8
import QtQuick.Controls 2.2
-import shared.controls 1.0
+
import shared.Sizes 1.0
-ToolButton {
+import "stores" 1.0
+import "views" 1.0
+
+Item {
id: root
- icon.color: "white"
- contentItem: null
- checkable: false
- // content item of ToolButton is not scaled correctly in some screen resolutions
- // need to revert this changes once: QTBUG-72569 is fixed.
- NeptuneIconLabel {
- anchors.centerIn: parent
- width: Sizes.dp(35)
- height: Sizes.dp(35)
- icon: root.icon
- color: root.icon.color
+ ICMusicView {
+ id: icMusicView
+ anchors.fill: parent
+ store: MusicStore {}
}
}
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.music-ic/controls/+lucee/TitleColumn.qml b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/controls/+lucee/TitleColumn.qml
new file mode 100644
index 00000000..6a177dfc
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/controls/+lucee/TitleColumn.qml
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Copyright (C) 2018 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.8
+import QtQuick.Controls 2.2
+import QtQuick.Layouts 1.2
+
+import shared.utils 1.0
+import shared.Style 1.0
+import shared.Sizes 1.0
+
+ColumnLayout {
+ id: root
+ spacing: Sizes.dp(15)
+
+ property int preferredWidth: Sizes.dp(240)
+ property alias currentSongTitle: songTitle.text
+ property alias currentArtisName: artistName.text
+ property alias currentAlbumName: albumName.text
+
+ property bool alignHorizontal: false
+
+ Label {
+ id: songTitle
+ Layout.preferredWidth: root.width
+ wrapMode: Text.WordWrap
+ font.weight: Font.Normal
+ font.pixelSize: Sizes.dp(40)
+ maximumLineCount: 2
+ horizontalAlignment: alignHorizontal ? Text.AlignHCenter : Text.AlignLeft
+ elide: Text.ElideRight
+ }
+
+ Label {
+ id: artistName
+ Layout.preferredWidth: root.width
+ wrapMode: Text.WordWrap
+ font.pixelSize: Sizes.dp(26)
+ font.weight: Font.Normal
+ visible: text !== ""
+ maximumLineCount: 1
+ horizontalAlignment: alignHorizontal ? Text.AlignHCenter : Text.AlignLeft
+ elide: Text.ElideRight
+ }
+
+ Label {
+ id: albumName
+ Layout.preferredWidth: root.width
+ wrapMode: Text.WordWrap
+ font.pixelSize: Sizes.dp(20)
+ visible: text !== ""
+ opacity: Style.opacityMedium
+ maximumLineCount: 1
+ horizontalAlignment: alignHorizontal ? Text.AlignHCenter : Text.AlignLeft
+ elide: Text.ElideRight
+
+ }
+}
+
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.music-ic/controls/MusicProgress.qml b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/controls/MusicProgress.qml
new file mode 100644
index 00000000..93f4f4ea
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/controls/MusicProgress.qml
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Copyright (C) 2018 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.8
+import QtQuick.Controls 2.2
+
+import shared.utils 1.0
+import shared.Style 1.0
+import shared.Sizes 1.0
+
+Control {
+ id: root
+
+ property bool clusterView: false
+ property bool labelOnTop: true
+ property string progressText: "0:0 / 0:0"
+ property real value // 0 <= value <=1
+ property int progressBarLabelLeftMargin: Sizes.dp(10)
+ readonly property int progressBarWidth: root.width - (root.labelOnTop
+ ? Sizes.dp(6) : Sizes.dp(5))
+
+ signal updatePosition(var value)
+
+ contentItem: Item {
+ anchors.fill: root
+ Label {
+ id: progressLabel
+ anchors.top: parent.top
+ anchors.topMargin: root.labelOnTop ? Sizes.dp(48) : 0
+ anchors.left: parent.left
+ anchors.leftMargin: root.progressBarLabelLeftMargin
+ font.pixelSize: Sizes.fontSizeS
+ text: root.progressText
+ opacity: Style.opacityMedium
+ }
+
+ ProgressBar {
+ id: progressBar
+ implicitWidth: root.progressBarWidth
+ implicitHeight: Sizes.dp(8)
+ anchors.centerIn: parent
+ anchors.verticalCenterOffset: Sizes.dp(-24)
+ anchors.horizontalCenterOffset: root.labelOnTop ? 0 : Sizes.dp(90)
+ value: root.value
+ }
+
+ MouseArea {
+ width: parent.width
+ height: Sizes.dp(50)
+ anchors.centerIn: progressBar
+ enabled: !root.clusterView
+ onPressed: {
+ var newValue = LayoutMirroring.enabled ? ((1 - mouseX / root.width)) : (mouseX / root.width);
+ root.updatePosition(newValue);
+ }
+ }
+ }
+}
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.music-ic/controls/TitleColumn.qml b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/controls/TitleColumn.qml
new file mode 100644
index 00000000..d16602aa
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/controls/TitleColumn.qml
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Copyright (C) 2018 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.8
+import QtQuick.Controls 2.2
+import QtQuick.Layouts 1.2
+
+import shared.utils 1.0
+import shared.Style 1.0
+import shared.Sizes 1.0
+
+ColumnLayout {
+ id: root
+ spacing: Sizes.dp(15)
+
+ property int preferredWidth: Sizes.dp(240)
+ property alias currentSongTitle: songTitle.text
+ property alias currentArtisName: artistName.text
+
+ Label {
+ id: songTitle
+ Layout.preferredWidth: root.width
+ wrapMode: Text.WordWrap
+ font.weight: Font.Light
+ maximumLineCount: 2
+ elide: Text.ElideRight
+ }
+
+ Label {
+ id: artistName
+ Layout.preferredWidth: root.width
+ wrapMode: Text.WordWrap
+ font.pixelSize: Sizes.fontSizeS
+ visible: text !== ""
+ opacity: Style.opacityMedium
+ maximumLineCount: 1
+ elide: Text.ElideRight
+ }
+}
+
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.music-ic/controls/qmldir b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/controls/qmldir
new file mode 100644
index 00000000..09b47c0b
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/controls/qmldir
@@ -0,0 +1,2 @@
+MusicProgress 1.0 MusicProgress.qml
+TitleColumn 1.0 TitleColumn.qml
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.music-ic/icon.png b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/icon.png
new file mode 100644
index 00000000..e0176b92
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/icon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:98297ae069ab8ac243aeedc49fb5a0c90e7c156803e3e9ba75ee1ff1a0ea7abe
+size 709
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.music-ic/panels/ICAlbumArtPanel.qml b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/panels/ICAlbumArtPanel.qml
new file mode 100644
index 00000000..f525bd9a
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/panels/ICAlbumArtPanel.qml
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Copyright (C) 2018 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.8
+
+import shared.utils 1.0
+import shared.Style 1.0
+import shared.Sizes 1.0
+
+import "../controls" 1.0
+
+Item {
+ id: root
+
+ property bool musicPlaying: false
+ property real musicPosition: 0.0
+ property alias currentSongTitle: titleColumn.currentSongTitle
+ property alias currentArtisName: titleColumn.currentArtisName
+ property alias currentProgressLabel: musicProgress.progressText
+
+ TitleColumn {
+ id: titleColumn
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.top: parent.top
+ anchors.topMargin: Sizes.dp(140)
+ }
+
+ MusicProgress {
+ id: musicProgress
+ width: root.width
+ height: Sizes.dp(100)
+ anchors.top: titleColumn.bottom
+ anchors.topMargin: Sizes.dp(10)
+ anchors.leftMargin: Sizes.dp(40)
+ anchors.rightMargin: Sizes.dp(40)
+ value: root.musicPosition
+ progressBarLabelLeftMargin: 3
+ clusterView: true
+ }
+}
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.music-ic/panels/qmldir b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/panels/qmldir
new file mode 100644
index 00000000..92edda7e
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/panels/qmldir
@@ -0,0 +1 @@
+ICAlbumArtPanel 1.0 ICAlbumArtPanel.qml
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.music-ic/stores/MusicStore.qml b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/stores/MusicStore.qml
new file mode 100644
index 00000000..50d0a64f
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/stores/MusicStore.qml
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Copyright (C) 2018 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.8
+import QtIvi 1.0
+import QtIvi.Media 1.0
+
+import shared.utils 1.0
+
+Store {
+ id: root
+
+ property alias musicPlaylist: player.playQueue
+ property int musicCount: player.playQueue.count
+
+ property MediaPlayer player: MediaPlayer { id: player }
+ property var currentEntry: player.currentTrack;
+ property bool playing: player.playState === MediaPlayer.Playing
+ property bool shuffleOn: player.playMode === MediaPlayer.Shuffle
+ property bool repeatOn: player.playMode === MediaPlayer.RepeatTrack
+ property string elapsedTime: Qt.formatTime(new Date(player.position), 'mm:ss')
+ property string totalTime: Qt.formatTime(new Date(player.duration), 'mm:ss')
+ property real currentTrackPosition : player.position / player.duration
+}
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.music-ic/stores/qmldir b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/stores/qmldir
new file mode 100644
index 00000000..59cb9371
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/stores/qmldir
@@ -0,0 +1 @@
+MusicStore 1.0 MusicStore.qml
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.music-ic/views/ICMusicView.qml b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/views/ICMusicView.qml
new file mode 100644
index 00000000..11dafa03
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/views/ICMusicView.qml
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Copyright (C) 2018 Pelagicore AG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.8
+
+import shared.utils 1.0
+import shared.Style 1.0
+import shared.Sizes 1.0
+
+import "../stores" 1.0
+import "../panels" 1.0
+
+Item {
+ id: root
+
+ property MusicStore store
+
+ Image {
+ anchors.fill: parent
+ source: Style.image("instrument-cluster-bg")
+ fillMode: Image.Stretch
+ }
+
+ ICAlbumArtPanel {
+ id: albumArt
+ width: Sizes.dp(540)
+ height: Sizes.dp(464)
+ anchors.centerIn: parent
+ anchors.verticalCenterOffset: Sizes.dp(50)
+ musicPlaying: root.store.playing
+ musicPosition: root.store.currentTrackPosition
+ currentSongTitle: root.store.currentEntry
+ ? root.store.currentEntry.title
+ : qsTr("Track unavailable")
+ currentArtisName: root.store.currentEntry ? root.store.currentEntry.artist : ""
+ currentProgressLabel: root.store.elapsedTime + " / " + root.store.totalTime
+ }
+}
diff --git a/src/neptune-cluster-app/apps/com.pelagicore.music-ic/views/qmldir b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/views/qmldir
new file mode 100644
index 00000000..68ca7e17
--- /dev/null
+++ b/src/neptune-cluster-app/apps/com.pelagicore.music-ic/views/qmldir
@@ -0,0 +1 @@
+ICMusicView 1.0 ICMusicView.qml
diff --git a/src/neptune-cluster-app/main.cpp b/src/neptune-cluster-app/main.cpp
new file mode 100644
index 00000000..abc64db2
--- /dev/null
+++ b/src/neptune-cluster-app/main.cpp
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2019-2020 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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
+**
+****************************************************************************/
+
+#include <QtGlobal>
+#include <QtGui/QGuiApplication>
+#include <QtGui/QIcon>
+#include <QtGui/QOpenGLContext>
+#include <QtQml/QQmlApplicationEngine>
+#include <QtCore/QLoggingCategory>
+#include <QtCore/QDir>
+#include <QtCore/QString>
+#include <QtCore/QCommandLineParser>
+
+#ifdef STUDIO3D_RUNTIME_INSTALLED
+ #include <qstudio3dglobal.h>
+#endif
+
+int main(int argc, char *argv[])
+{
+ QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
+ QCoreApplication::setApplicationName(QStringLiteral("Neptune Cluster"));
+ QCoreApplication::setOrganizationName(QStringLiteral("Luxoft Sweden AB"));
+ QCoreApplication::setOrganizationDomain(QStringLiteral("luxoft.com"));
+ QCoreApplication::setApplicationVersion("0.1");
+ QGuiApplication app(argc, argv);
+ // force application path, it'll update @load_path and others
+ QDir::setCurrent(qApp->applicationDirPath());
+
+ // @todo: add -c config file option and config file for it (json, xml, etc)
+ QCommandLineParser cmdParser;
+ cmdParser.setApplicationDescription(
+ "Neptune Cluster\n\n"
+ "Logging is turned off by default, to control log output please check command line "
+ "options or Qt Help for QT_LOGGING_RULES environment variable.\n");
+ cmdParser.addHelpOption();
+ cmdParser.addVersionOption();
+ const QCommandLineOption enableDefaultLoggingOption("verbose",
+ "Enables default Qt logging filter.");
+ cmdParser.addOption(enableDefaultLoggingOption);
+ cmdParser.process(app);
+ if (!cmdParser.isSet(enableDefaultLoggingOption)) {
+ QLoggingCategory::setFilterRules("*=false");
+ }
+
+ if (!qEnvironmentVariableIsSet("QT_QUICK_CONTROLS_STYLE_PATH")) {
+ qputenv("QT_QUICK_CONTROLS_STYLE_PATH"
+ , (QCoreApplication::applicationDirPath() + QStringLiteral("/styles")).toLocal8Bit());
+ }
+
+ if (!qEnvironmentVariableIsSet("QT_QUICK_CONTROLS_CONF")) {
+ qputenv("QT_QUICK_CONTROLS_CONF", (QCoreApplication::applicationDirPath()
+ + QStringLiteral("/styles/neptune/style.conf")).toLocal8Bit());
+ }
+
+ if (!qEnvironmentVariableIsSet("QT_QUICK_CONTROLS_ICON_PATH")) {
+ qputenv("QT_QUICK_CONTROLS_ICON_PATH", (QCoreApplication::applicationDirPath()
+ + QStringLiteral("/imports_shared/assets/icons")).toLocal8Bit());
+ }
+
+ if (!qEnvironmentVariableIsSet("SERVER_CONF_PATH")) {
+ qputenv("SERVER_CONF_PATH", (QCoreApplication::applicationDirPath()
+ + QStringLiteral("/server.conf")).toLocal8Bit());
+ }
+
+ if (!qEnvironmentVariableIsSet("QT_STYLE_OVERRIDE")) {
+ qputenv("QT_STYLE_OVERRIDE", QStringLiteral("neptune").toLocal8Bit());
+ }
+
+#ifdef STUDIO3D_RUNTIME_INSTALLED
+ QSurfaceFormat::setDefaultFormat(Q3DS::surfaceFormat());
+#endif
+
+ QQmlApplicationEngine engine;
+ engine.addImportPath(QDir::currentPath()+QStringLiteral("/imports_shared/"));
+ engine.load(QStringLiteral("neptune-cluster/main.qml"));
+ if (engine.rootObjects().isEmpty())
+ return -1;
+
+ return app.exec();
+}
diff --git a/src/neptune-cluster-app/main.qml b/src/neptune-cluster-app/main.qml
new file mode 100644
index 00000000..51cfd694
--- /dev/null
+++ b/src/neptune-cluster-app/main.qml
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.12
+import QtQuick.Window 2.12
+
+import shared.Style 1.0
+import shared.Sizes 1.0
+import "../apps/com.theqtcompany.cluster/stores" 1.0
+import "../apps/com.theqtcompany.cluster/views" 1.0
+
+Window {
+ id: root
+ visible: true
+ width: 1920
+ height: 1080
+ title: qsTr("Cluster")
+ color: "black"
+
+ readonly property real mockedWindowsAcpectRatio: 1920 / 720
+ Component.onCompleted: {
+ root.Style.theme = Style.Dark;
+ }
+
+ ClusterRootStore {
+ id:clrst
+ devMode: true
+ }
+
+ Connections {
+ target: clrst.uiSettings
+ function onThemeChanged() { root.Style.theme = clrst.uiSettings.theme }
+ function onAccentColorChanged() { root.Style.accentColor = clrst.uiSettings.accentColor }
+ }
+
+ MockedWindows {
+ id: mockedWindows
+
+ clip: true
+ height: Math.floor(root.width / mockedWindowsAcpectRatio) <= root.height
+ ? root.width / mockedWindowsAcpectRatio
+ : root.height;
+ width: height * mockedWindowsAcpectRatio
+
+ onWidthChanged: {
+ root.Sizes.scale = mockedWindows.width / 1920;
+ }
+
+ anchors.centerIn: parent
+
+ ClusterView {
+ rtlMode: clrst.uiSettings.rtlMode
+ anchors.fill: parent
+ store: clrst;
+ }
+
+ Image {
+ z: -1
+ anchors.fill: parent
+ source: Style.image("instrument-cluster-bg")
+ fillMode: Image.Stretch
+ }
+ }
+
+ Launcher {
+ id:lnch
+ z: 2
+ anchors.top: mockedWindows.top
+ anchors.horizontalCenter: mockedWindows.horizontalCenter
+ onAppClicked: mockedWindows.runApp(appUrl)
+ }
+}
diff --git a/src/neptune-cluster-app/neptune-cluster-app.pro b/src/neptune-cluster-app/neptune-cluster-app.pro
new file mode 100644
index 00000000..154c5fe4
--- /dev/null
+++ b/src/neptune-cluster-app/neptune-cluster-app.pro
@@ -0,0 +1,48 @@
+requires(linux|macos) # @todo add win
+
+TEMPLATE = app
+TARGET = neptune-cluster-app
+QT *= quick gui core ivicore
+
+isEmpty(INSTALL_PREFIX) {
+ INSTALL_PREFIX=/opt
+}
+
+# check ogl-runtime
+qtHaveModule(studio3d) {
+ QT *= studio3d
+ DEFINES *= STUDIO3D_RUNTIME_INSTALLED
+}
+
+CONFIG += c++11
+macos: CONFIG -= app_bundle
+
+DESTDIR = $$OUT_PWD/../../
+
+QMAKE_RPATHDIR += $$QMAKE_REL_RPATH_BASE/$$relative_path($$INSTALL_PREFIX/neptune3/lib, $$INSTALL_PREFIX/neptune3/)
+LIBS += -L$$LIB_DESTDIR -l$$qtLibraryTarget(remotesettings) -l$$qtLibraryTarget(drivedata)
+
+SOURCES += \
+ main.cpp
+
+OTHER_FILES += $$files($$PWD/*.qml, true)
+
+target.path = $$INSTALL_PREFIX/neptune3
+
+installFiles.files = $$files($$PWD/*.qml, false) apps
+installFiles.path = $$INSTALL_PREFIX/neptune3/neptune-cluster/
+installFiles.CONFIG += no_check_exist
+
+INSTALLS += target installFiles
+
+# copy files in neptune-cluster-app build folder
+FILES = main.qml ClusterRootStore.qml MockedWindows.qml Launcher.qml
+do_copydata.commands += $(MKDIR) $$shell_path($$DESTDIR/neptune-cluster) $$escape_expand(\n\t)
+for (f , FILES) {
+ do_copydata.commands += $(COPY) $$shell_path($$PWD/$${f}) $$shell_path($$DESTDIR/neptune-cluster/) $$escape_expand(\n\t)
+}
+
+do_copydata.commands += $(COPY_DIR) $$shell_path($$PWD/apps) $$shell_path($$DESTDIR/neptune-cluster/) $$escape_expand(\n\t)
+
+first.depends = do_copydata
+QMAKE_EXTRA_TARGETS += first do_copydata
diff --git a/src/neptune3-ui-qsr-cluster/main.cpp b/src/neptune3-ui-qsr-cluster/main.cpp
index f2b2965b..9a9627b2 100644
--- a/src/neptune3-ui-qsr-cluster/main.cpp
+++ b/src/neptune3-ui-qsr-cluster/main.cpp
@@ -37,6 +37,7 @@ functional safety standards and it depends on Qt classes.
You should not use this example in production environment.
*/
#include <QtGui>
+#include <QtGui/QFontDatabase>
#include <QtSafeRenderer/qsafelayout.h>
#include <QtSafeRenderer/qsafechecksum.h>
@@ -51,25 +52,42 @@ int main(int argc, char **argv)
{
QGuiApplication app(argc, argv);
+ QFontDatabase::addApplicationFont("imports_shared/assets/fonts/DejaVuSans.ttf");
+
QDir::setCurrent(qApp->applicationDirPath());
SafeRenderer::QSafeLayoutFileReader layout("qsr-safelayout/SafeTelltalesPanel.srl");
- //Demo case, update window position on Cluster window move
- QSettings settings(QStringLiteral("Luxoft Sweden AB"), QStringLiteral("QSRCluster"));
- bool stickToCluster = settings.value(QStringLiteral("gui/stick_to_cluster"), true).toBool();
+ //Demo case, update window position on non-Safe UI cluster window position change and resize
+ bool stickToCluster = false;
+ if (SafeWindow::isRunningOnDesktop()) {
+ QSettings settings(QStringLiteral("Luxoft Sweden AB"), QStringLiteral("QSRCluster"));
+ stickToCluster = settings.value(QStringLiteral("gui/stick_to_cluster"), true).toBool();
+ }
SafeRenderer::QSafeSize screenSize;
if (stickToCluster) {
- screenSize.setWidth(layout.size().width());
- screenSize.setHeight(layout.size().height());
+ // Demo Desktop case
+ // if layout doesn't fit on screen -> resize it to fit for the startup
+ // as we don't have info about non-safe UI window size and also avoid snapping on
+ // screen edges (it won't be possible to move or resize window)
+ QSize availSize = qApp->primaryScreen()->availableSize();
+ if (availSize.width() < layout.size().width() * 1.1
+ || availSize.height() < layout.size().height() * 1.1) {
+ QSize windowSize(layout.size().width(), layout.size().height());
+ windowSize.scale(availSize * 0.9, Qt::KeepAspectRatio);
+ screenSize.setWidth(windowSize.width());
+ screenSize.setHeight(windowSize.height());
+ } else {
+ screenSize.setWidth(layout.size().width());
+ screenSize.setHeight(layout.size().height());
+ }
} else {
screenSize.setWidth(static_cast<SafeRenderer::quint32>(qApp->primaryScreen()->size().width()));
screenSize.setHeight(static_cast<SafeRenderer::quint32>(qApp->primaryScreen()->size().height()));
}
- SafeWindow telltaleWindow(screenSize, layout.size());
- telltaleWindow.setFlag(Qt::WindowDoesNotAcceptFocus, true);
+ SafeWindow telltaleWindow(screenSize, layout.size(), stickToCluster);
NeptuneSafeStateManager stateManager(telltaleWindow, layout);
@@ -98,6 +116,8 @@ int main(int argc, char **argv)
if (stickToCluster) {
QObject::connect(&msgHandler, &TcpMsgHandler::mainWindowPosGot, &telltaleWindow, &SafeWindow::moveWindow);
+ QObject::connect(&msgHandler, &TcpMsgHandler::mainWindowPanelSizeGot, &telltaleWindow, &SafeWindow::resizeWindow);
+ QObject::connect(&msgHandler, &TcpMsgHandler::mainWindowPanelOriginGot, &telltaleWindow, &SafeWindow::applyPanelOrigin);
}
//Remote settings server client
diff --git a/src/neptune3-ui-qsr-cluster/neptune3-ui-qsr-cluster.pro b/src/neptune3-ui-qsr-cluster/neptune3-ui-qsr-cluster.pro
index f719c071..e67bfe3d 100644
--- a/src/neptune3-ui-qsr-cluster/neptune3-ui-qsr-cluster.pro
+++ b/src/neptune3-ui-qsr-cluster/neptune3-ui-qsr-cluster.pro
@@ -9,7 +9,18 @@ else: target.path = $$INSTALL_PREFIX/neptune3
INSTALLS += target
CONFIG += exceptions c++11
-macos: CONFIG -= app_bundle
+macos: {
+ CONFIG -= app_bundle
+ SOURCES += safewindow_mac.mm
+ HEADERS += safewindow_mac.h
+}
+
+win32 {
+ wrapper.files = neptune3-ui-qsr-cluster_wrapper.bat
+ wrapper.path = $$INSTALL_PREFIX/neptune3
+ INSTALLS += wrapper
+ LIBS += -lUser32
+}
QT = core gui qtsaferenderer network ivicore
@@ -18,7 +29,7 @@ LIBS += -L$$LIB_DESTDIR -l$$qtLibraryTarget(remotesettings) -l$$qtLibraryTarget(
INCLUDEPATH += $$OUT_PWD/../drivedata/frontend
INCLUDEPATH += $$OUT_PWD/../remotesettings/frontend
-SOURCES = main.cpp \
+SOURCES += main.cpp \
icsettingshandler.cpp \
neptunesafestatemanager.cpp \
safewindow.cpp \
diff --git a/src/neptune3-ui-qsr-cluster/neptune3-ui-qsr-cluster_wrapper.bat b/src/neptune3-ui-qsr-cluster/neptune3-ui-qsr-cluster_wrapper.bat
new file mode 100644
index 00000000..5e9f3211
--- /dev/null
+++ b/src/neptune3-ui-qsr-cluster/neptune3-ui-qsr-cluster_wrapper.bat
@@ -0,0 +1,37 @@
+@echo off
+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+::
+:: Copyright (C) 2020 Luxoft Sweden AB
+:: Contact: https://www.qt.io/licensing/
+::
+:: This file is part of the Neptune IVI UI.
+::
+:: $QT_BEGIN_LICENSE:GPL-QTAS$
+:: Commercial License Usage
+:: Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+:: approved by the KDE Free Qt Foundation. The licenses are as published by
+:: the Free Software Foundation and appearing in the file LICENSE.GPL3
+:: 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
+::
+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+SetLocal EnableDelayedExpansion
+set WRAPPER_PWD=%~dp0
+set PATH=%WRAPPER_PWD%\..\bin;%WRAPPER_PWD%\..\..\..\Tools\OpenSSL\Win_x64\bin;%PATH%
+%WRAPPER_PWD%\neptune3-ui-qsr-cluster %*
+EndLocal
diff --git a/src/neptune3-ui-qsr-cluster/safewindow.cpp b/src/neptune3-ui-qsr-cluster/safewindow.cpp
index cf305bd3..4901caf4 100644
--- a/src/neptune3-ui-qsr-cluster/safewindow.cpp
+++ b/src/neptune3-ui-qsr-cluster/safewindow.cpp
@@ -30,20 +30,65 @@
****************************************************************************/
#include "safewindow.h"
+#ifdef Q_OS_MACOS
+ #include "safewindow_mac.h"
+#endif
-SafeWindow::SafeWindow(const SafeRenderer::QSafeSize &size, const SafeRenderer::QSafeSize &frameSize,
+SafeWindow::SafeWindow(const SafeRenderer::QSafeSize &size,
+ const SafeRenderer::QSafeSize &frameSize, bool stickToCluster,
QWindow *parent)
:QWindow(parent)
,AbstractWindow(size)
,m_buffer(frameSize)
+ ,m_transparent(qgetenv("QSR_FILL_BLACK_BACKGROUND").isNull())
+ ,m_stickToCluster(stickToCluster)
{
resize(size.width(), size.height());
- m_transparent = qgetenv("QSR_FILL_BLACK_BACKGROUND").isNull();
+ if (m_stickToCluster) {
+ #ifdef Q_OS_LINUX
+ // KDE desktop runs Plasma, which doesn't allow in our case rise qsr window,
+ // that's why qsr window stays under non-safe UI window.
+ // For KDE we set for window stay-on-top flag which solves described issue.
+ // Interacting without this flag is a bit more comfortable, so we leave it for other
+ // environments
+ const QString desktopEnvironment = QString(qgetenv("DESKTOP_SESSION")).toLower();
+ if (desktopEnvironment.contains(QStringLiteral("plasma"))
+ || desktopEnvironment.contains(QStringLiteral("kde"))) {
+ setFlag(Qt::WindowStaysOnTopHint);
+ }
+ #endif
+
+ // Desktop demo case: center on the screen on start
+ setPosition(qApp->primaryScreen()->availableGeometry().x()
+ + (qApp->primaryScreen()->availableGeometry().width() - size.width()) / 2,
+ qApp->primaryScreen()->availableGeometry().y()
+ + (qApp->primaryScreen()->availableGeometry().height() - size.height()) / 2);
+ }
//to run on KMS/DRM on NUC set transparent to false
//otherwise nothing will be shown
if (m_transparent) {
+ #ifdef Q_OS_MACOS
+ // Need to call native Obj-C method to make window
+ // transparent om Mac QTBUG-77637
+ SafeWindowMac::setWindowTransparent(reinterpret_cast<void*>(this->winId()));
+ #endif
+ #ifdef Q_OS_WIN32
+ // QWindow doesn't allow making window background transparent on Windows,
+ // we have to use native calls to set black color as transparent.
+ // We make window stay on top as rise() function doesn't work as it does on
+ // macOS and Linux platforms (still remains under cluster window)
+ this->setFlag(Qt::WindowStaysOnTopHint);
+ this->setFlag(Qt::WindowTitleHint);
+ this->setFlag(Qt::WindowSystemMenuHint);
+ this->setFlag(Qt::WindowCloseButtonHint);
+
+ HWND hwnd = reinterpret_cast<HWND>(this->winId());
+ SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
+ SetLayeredWindowAttributes(hwnd, 0, 0, LWA_COLORKEY);
+ #endif
+
QSurfaceFormat fmt = format();
fmt.setAlphaBufferSize(8);
setFormat(fmt);
@@ -53,6 +98,14 @@ SafeWindow::SafeWindow(const SafeRenderer::QSafeSize &size, const SafeRenderer::
m_backingStore = new QBackingStore(this);
}
+bool SafeWindow::isRunningOnDesktop() {
+#if defined(Q_OS_WIN) || defined(Q_OS_MACOS)
+ return true;
+#else
+ return qApp->platformName() == QStringLiteral("xcb");
+#endif
+}
+
bool SafeWindow::event(QEvent *event)
{
if (event->type() == QEvent::UpdateRequest) {
@@ -80,7 +133,7 @@ void SafeWindow::exposeEvent(QExposeEvent *)
void SafeWindow::render(const SafeRenderer::Rect &dirtyArea)
{
- (void)dirtyArea;
+ Q_UNUSED(dirtyArea)
renderNow();
}
@@ -106,18 +159,55 @@ void SafeWindow::renderNow()
void SafeWindow::render(QPainter *painter)
{
- int x = (width() - m_buffer.image().width()) / 2;
- int y = (height() - m_buffer.image().height()) / 2;
-
- QRect rect(x, y, m_buffer.image().width(), m_buffer.image().height());
- painter->drawImage(rect, m_buffer.image());
+ if (m_stickToCluster) {
+ // Desktop demo case: fit frame to window
+ QRect rect(0, 0, width(), height());
+ painter->setRenderHint(QPainter::SmoothPixmapTransform, true);
+ painter->drawImage(rect, m_buffer.image(), m_buffer.image().rect());
+ } else {
+ // Center qsr rendered frame inside window
+ int x = (width() - m_buffer.image().width()) / 2;
+ int y = (height() - m_buffer.image().height()) / 2;
+
+ QRect rect(x, y, m_buffer.image().width(), m_buffer.image().height());
+ painter->drawImage(rect, m_buffer.image());
+ }
}
void SafeWindow::moveWindow(int x, int y)
{
+ m_rootWindowX = x;
+ m_rootWindowY = y;
+
+ setWindowState(Qt::WindowNoState);
+ setPosition(m_rootWindowX + m_panelOriginX, m_rootWindowY + m_panelOriginY);
+ raise();
+ requestActivate();
+}
+
+void SafeWindow::resizeWindow(int width, int height)
+{
+ if (width <= 0 || height <= 0)
+ return;
+
+ setWindowState(Qt::WindowNoState);
+ resize(width, height);
+ raise();
+ requestActivate();
+}
+
+void SafeWindow::applyPanelOrigin(int dx, int dy)
+{
+ m_panelOriginX = dx;
+ m_panelOriginY = dy;
+
setWindowState(Qt::WindowNoState);
- setPosition(x, y);
+ setPosition(m_rootWindowX + m_panelOriginX, m_rootWindowY + m_panelOriginY);
raise();
requestActivate();
}
+SafeRenderer::AbstractFrameBuffer *SafeWindow::buffer()
+{
+ return &m_buffer;
+}
diff --git a/src/neptune3-ui-qsr-cluster/safewindow.h b/src/neptune3-ui-qsr-cluster/safewindow.h
index 853cffd9..50d5d60f 100644
--- a/src/neptune3-ui-qsr-cluster/safewindow.h
+++ b/src/neptune3-ui-qsr-cluster/safewindow.h
@@ -82,21 +82,31 @@ class SafeWindow : public QWindow, public SafeRenderer::AbstractWindow
{
Q_OBJECT
public:
- explicit SafeWindow(const SafeRenderer::QSafeSize &size,
- const SafeRenderer::QSafeSize &frameSize, QWindow *parent = 0);
+ SafeWindow(const SafeRenderer::QSafeSize &size,
+ const SafeRenderer::QSafeSize &frameSize,
+ bool stickToCluster, QWindow *parent = 0);
virtual void render(QPainter *painter);
//Window
- virtual void render(const SafeRenderer::Rect &dirtyArea);
- virtual SafeRenderer::AbstractFrameBuffer *buffer() {
- return &m_buffer;
- }
+ virtual void render(const SafeRenderer::Rect &dirtyArea) override;
+ virtual SafeRenderer::AbstractFrameBuffer *buffer() override;
+
+ // Copies behavior of QtApplicationManager to decide if we are running on Desktop
+ static bool isRunningOnDesktop();
public slots:
void renderLater();
void renderNow();
+ // Apply cluster widow position
+ // Used when running on Desktop
void moveWindow(int x, int y);
+ // Apply cluster panel width and height to window size
+ // Used when running on Desktop
+ void resizeWindow(int width, int weight);
+ // Apply cluster panel position inside cluster window
+ // Used when running on desktop
+ void applyPanelOrigin(int dx, int dy);
protected:
bool event(QEvent *event) override;
@@ -108,6 +118,10 @@ private:
QBackingStore *m_backingStore;
ScreenBuffer m_buffer;
bool m_transparent;
+ int m_rootWindowX{0};
+ int m_rootWindowY{0};
+ int m_panelOriginX{0};
+ int m_panelOriginY{0};
+ bool m_stickToCluster;
};
-
-#endif // RASTERWINDOW_H
+#endif // SAFEWINDOW_H
diff --git a/src/neptune3-ui-qsr-cluster/safewindow_mac.h b/src/neptune3-ui-qsr-cluster/safewindow_mac.h
new file mode 100644
index 00000000..a4f3fbba
--- /dev/null
+++ b/src/neptune3-ui-qsr-cluster/safewindow_mac.h
@@ -0,0 +1,38 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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
+**
+****************************************************************************/
+
+#ifndef SAFEWINDOW_MAC_H
+#define SAFEWINDOW_MAC_H
+ class SafeWindowMac {
+ public:
+ static void setWindowTransparent(void *view);
+ };
+#endif
diff --git a/src/neptune3-ui-qsr-cluster/safewindow_mac.mm b/src/neptune3-ui-qsr-cluster/safewindow_mac.mm
new file mode 100644
index 00000000..52aea06a
--- /dev/null
+++ b/src/neptune3-ui-qsr-cluster/safewindow_mac.mm
@@ -0,0 +1,39 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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
+**
+****************************************************************************/
+
+#include "safewindow_mac.h"
+#import <Appkit/AppKit.h>
+
+void SafeWindowMac::setWindowTransparent(void *view)
+{
+ NSWindow *nsWindow = (static_cast<NSView *>(view)).window;
+ nsWindow.backgroundColor = NSColor.clearColor;
+}
diff --git a/src/neptune3-ui-qsr-cluster/tcpmsghandler.cpp b/src/neptune3-ui-qsr-cluster/tcpmsghandler.cpp
index 24875144..4954f709 100644
--- a/src/neptune3-ui-qsr-cluster/tcpmsghandler.cpp
+++ b/src/neptune3-ui-qsr-cluster/tcpmsghandler.cpp
@@ -153,12 +153,27 @@ void TcpMsgHandler::readData()
}
if (event.type() == SafeRenderer::EventSetPosition) {
- const SafeRenderer::QSafeEventPosition &movePos = static_cast<const SafeRenderer::QSafeEventPosition &>(event);
- const char* item = "mainWindow";
+ const SafeRenderer::QSafeEventPosition &eventData =
+ static_cast<const SafeRenderer::QSafeEventPosition &>(event);
+ const char* itemWindowPos = "mainWindowPos";
+ const char* itemPanelSize = "mainWindowPanelSize";
+ const char* itemPanelOrigin = "mainWindowPanelOrigin";
+
//Demo case, move telltales over Cluster window
- if (movePos.id() == SafeRenderer::qsafe_hash(item, SafeRenderer::safe_strlen(item))) {
- //skip handling, just apply position
- emit mainWindowPosGot(static_cast<int>(movePos.x()), static_cast<int>(movePos.y()));
+ if (eventData.id() == SafeRenderer::qsafe_hash(itemWindowPos,
+ SafeRenderer::safe_strlen(itemWindowPos))) {
+ //skip handling, just apply window position
+ emit mainWindowPosGot(eventData.x(), eventData.y());
+ continue;
+ } else if (eventData.id() == SafeRenderer::qsafe_hash(itemPanelSize,
+ SafeRenderer::safe_strlen(itemPanelSize))) {
+ // got cluster panel size
+ emit mainWindowPanelSizeGot(eventData.x(), eventData.y());
+ continue;
+ } else if (eventData.id() == SafeRenderer::qsafe_hash(itemPanelOrigin,
+ SafeRenderer::safe_strlen(itemPanelOrigin))) {
+ // got cluster panel position inside window
+ emit mainWindowPanelOriginGot(eventData.x(), eventData.y());
continue;
}
}
diff --git a/src/neptune3-ui-qsr-cluster/tcpmsghandler.h b/src/neptune3-ui-qsr-cluster/tcpmsghandler.h
index 5dc4302e..363bb8f5 100644
--- a/src/neptune3-ui-qsr-cluster/tcpmsghandler.h
+++ b/src/neptune3-ui-qsr-cluster/tcpmsghandler.h
@@ -63,6 +63,8 @@ private:
signals:
void mainWindowPosGot(int x, int y);
+ void mainWindowPanelSizeGot(int width, int height);
+ void mainWindowPanelOriginGot(int dx, int dy);
private:
NeptuneSafeStateManager *m_stateManager;
diff --git a/src/neptune3-ui/main.cpp b/src/neptune3-ui/main.cpp
index 80591cb8..ff76f49d 100644
--- a/src/neptune3-ui/main.cpp
+++ b/src/neptune3-ui/main.cpp
@@ -36,9 +36,10 @@
#include <QtIviCore/QtIviCoreVersion>
#include <QtAppManMain/main.h>
#include <QtAppManMain/defaultconfiguration.h>
-#include <QtAppManPackage/package.h>
-#include <QtAppManInstaller/sudo.h>
+#include <QtAppManPackage/packageutilities.h>
+#include <QtAppManManager/sudo.h>
#include <QtAppManWindow/touchemulation.h>
+#include <QtGui/QFontDatabase>
#include <QGuiApplication>
#include <QTranslator>
#include <QLibraryInfo>
@@ -90,11 +91,10 @@ Q_DECL_EXPORT int main(int argc, char *argv[])
Logging::initialize();
- Package::ensureCorrectLocale();
+ PackageUtilities::ensureCorrectLocale();
try {
- QStringList deploymentWarnings;
- Sudo::forkServer(Sudo::DropPrivilegesPermanently, &deploymentWarnings);
+ Sudo::forkServer(Sudo::DropPrivilegesPermanently);
qputenv("QTIVIMEDIA_SIMULATOR_DATABASE", QFile::encodeName(QDir::homePath() + "/media.db"));
qputenv("QT_IM_MODULE", "qtvirtualkeyboard");
@@ -114,6 +114,8 @@ Q_DECL_EXPORT int main(int argc, char *argv[])
startExtraProcess(QCoreApplication::applicationDirPath() + "/drivedata-simulation-server");
startExtraProcess(QCoreApplication::applicationDirPath() + "/remotesettings-server");
#endif
+ QFontDatabase::addApplicationFont(QCoreApplication::applicationDirPath()
+ + "/imports_shared/assets/fonts/DejaVuSans.ttf");
// load the Qt translations
QTranslator qtTranslator;
@@ -128,7 +130,7 @@ Q_DECL_EXPORT int main(int argc, char *argv[])
#endif
cfg.parse();
- a.setup(&cfg, deploymentWarnings);
+ a.setup(&cfg);
#ifdef USE_QT_SAFE_RENDERER
//Set env variables for Qt Safe Renderer for sending heartbeats
diff --git a/src/neptune3-ui/neptune3-ui.pro b/src/neptune3-ui/neptune3-ui.pro
index 0838def9..106b0d1f 100644
--- a/src/neptune3-ui/neptune3-ui.pro
+++ b/src/neptune3-ui/neptune3-ui.pro
@@ -1,10 +1,13 @@
-VERSION = 5.13.1
+VERSION = 5.15.1
TEMPLATE = app
TARGET = neptune3-ui
include(../../config.pri)
-macos:CONFIG -= app_bundle
+macos: {
+ CONFIG -= app_bundle
+ CONFIG *= separate_debug_info
+}
CONFIG *= no_private_qt_headers_warning link_pkgconfig
QT *= appman_main-private testlib gui-private
diff --git a/src/remotesettings/app/DevelopmentPage.qml b/src/remotesettings/app/DevelopmentPage.qml
index 6f049124..d84f16fa 100644
--- a/src/remotesettings/app/DevelopmentPage.qml
+++ b/src/remotesettings/app/DevelopmentPage.qml
@@ -1,6 +1,6 @@
-/****************************************************************************
+/****************************************************************************
**
-** Copyright (C) 2019 Luxoft Sweden AB
+** Copyright (C) 2019-2020 Luxoft Sweden AB
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Neptune 3 UI.
@@ -54,7 +54,7 @@ Flickable {
Layout.alignment: Qt.AlignHCenter
Label {
- text: "System UI"
+ text: qsTr("System UI")
Layout.alignment: Qt.AlignHCenter
font.bold: true
}
@@ -69,11 +69,21 @@ Flickable {
}
Label {
- text: "Cluster"
+ text: qsTr("Cluster")
Layout.alignment: Qt.AlignHCenter
font.bold: true
}
+ Button {
+ Layout.alignment: Qt.AlignHCenter
+ text: instrumentCluster.enableSimulation
+ ? qsTr("Disable simulation")
+ : qsTr("Enable simulation")
+ onClicked: {
+ instrumentCluster.enableSimulation = !instrumentCluster.enableSimulation;
+ }
+ }
+
GridLayout {
Layout.alignment: Qt.AlignHCenter
columns: root.width < neptuneScale(100) ? 2 : 4
@@ -94,13 +104,13 @@ Flickable {
Label {
- text: "Vehicle state"
+ text: qsTr("Vehicle state")
Layout.alignment: Qt.AlignHCenter
font.bold: true
}
GridLayout {
- enabled: instrumentCluster.isConnected
+ enabled: instrumentCluster.isConnected && !instrumentCluster.enableSimulation
Layout.alignment: Qt.AlignHCenter
columns: root.width > 2 * (outsideTemperatureLabel.width + outsideTemperature.width + columnSpacing)
? 4 : 2
@@ -116,9 +126,9 @@ Flickable {
Slider {
id: outsideTemperature
value: instrumentCluster.outsideTemperatureCelsius
- from: -100
+ from: -60.0
stepSize: 0.5
- to: 100.0
+ to: 60.0
onValueChanged: {
if (pressed) {
instrumentCluster.outsideTemperatureCelsius = value
@@ -141,37 +151,22 @@ Flickable {
value: instrumentCluster.mileageKm
from: 0
stepSize: 0.5
- to: 9E6
+ to: 1E6
onValueChanged: if (pressed) { instrumentCluster.mileageKm = value }
Label {
anchors.centerIn: parent.handle
anchors.verticalCenterOffset: - parent.handle.height * 2
- text: parent.value
+ text: parent.value.toFixed(2)
}
}
// Route progress
Label {
- text: qsTr("Route \n progress, %")
+ text: qsTr("Route \n progress, % ")
}
- Slider {
- id: routeProgressSlider
- from: 0
- to: 1.0
- stepSize: 0.01
- value: instrumentCluster.navigationProgressPercents
- onValueChanged: {
- if (pressed) {
- instrumentCluster.navigationProgressPercents = value
- }
- }
-
- Label {
- anchors.centerIn: parent.handle
- anchors.verticalCenterOffset: - parent.handle.height * 2
- text: parent.value.toFixed(2)
- }
+ Label {
+ text: (100.0 * instrumentCluster.navigationProgressPercents).toFixed(0)
}
// Route distance
@@ -200,7 +195,7 @@ Flickable {
RowLayout {
- enabled: instrumentCluster.isConnected
+ enabled: instrumentCluster.isConnected && !instrumentCluster.enableSimulation
Layout.alignment: Qt.AlignHCenter
// driveTrainState field
Label {
@@ -245,60 +240,23 @@ Flickable {
Layout.alignment: Qt.AlignHCenter
spacing: 50
- //Driving mode range Field
- Dial {
- id: drivingModeRangeDial
- from: 0
- to: 1000
- stepSize: 1.0
- value: instrumentCluster.drivingModeRangeKm
- onMoved: instrumentCluster.drivingModeRangeKm = value
-
- Label {
- text: qsTr("Range:")
- anchors.bottom: parent.verticalCenter
- anchors.horizontalCenter: parent.horizontalCenter
- }
-
- Label {
- text: Math.round(parent.value)
- anchors.top: parent.verticalCenter
- anchors.horizontalCenter: parent.horizontalCenter
- }
+ Label {
+ text: qsTr("Range: ") + instrumentCluster.drivingModeRangeKm
}
- // ECO mode range Field
- Dial {
- id: ecoModeRangeDial
- from: 0
- to: 500
- stepSize: 1.0
- value: instrumentCluster.drivingModeECORangeKm
- onMoved: instrumentCluster.drivingModeECORangeKm = value
-
- Label {
- text: qsTr("ECO Range:")
- anchors.bottom: parent.verticalCenter
- anchors.horizontalCenter: parent.horizontalCenter
- }
-
-
- Label {
- text: Math.round(parent.value)
- anchors.top: parent.verticalCenter
- anchors.horizontalCenter: parent.horizontalCenter
- }
+ Label {
+ text: qsTr("ECO Range: ") + instrumentCluster.drivingModeECORangeKm
}
}
Label {
- text: "Telltales"
+ text: qsTr("Telltales")
Layout.alignment: Qt.AlignHCenter
font.bold: true
}
GridLayout {
- enabled: instrumentCluster.isConnected
+ enabled: instrumentCluster.isConnected && !instrumentCluster.enableSimulation
Layout.alignment: Qt.AlignHCenter
columns: root.width < neptuneScale(100) ? 2 : 4
diff --git a/src/remotesettings/app/app.pro b/src/remotesettings/app/app.pro
index 8312a400..e5fd7b68 100644
--- a/src/remotesettings/app/app.pro
+++ b/src/remotesettings/app/app.pro
@@ -1,4 +1,4 @@
-VERSION = 5.13.1
+VERSION = 5.15.1
TARGET = neptune-companion-app
DESTDIR = $$BUILD_DIR
QT += quick ivicore ivimedia
@@ -35,26 +35,7 @@ QMAKE_RPATHDIR += $$QMAKE_REL_RPATH_BASE/$$relative_path($$INSTALL_PREFIX/neptun
#needed for the android deployment to include additional qml plugins
QML_IMPORT_PATH += $$BUILD_DIR/imports_shared_cpp
-android {
- copydata.commands = $(COPY_DIR) $$[QT_INSTALL_PLUGINS]/qtivi $$BUILD_DIR/plugins
- first.depends = $(first) copydata
- export(first.depends)
- export(copydata.commands)
- QMAKE_EXTRA_TARGETS += first copydata
-
-#This is used to tell the deployment tool to include these additional
-#libs to the apk. This library (libQt5RemoteObjects) is not directly used by the
-#app itself, but by the backend plugin.
- ANDROID_EXTRA_LIBS = $$[QT_INSTALL_LIBS]/libQt5RemoteObjects.so
-
-#In case we have some other than QML plugins to include to the apk, this is the
-#variable to use. In this case we use it to include the Qtivi backend plugin,
-#which is expected to be found under directory "qtivi". For this to work, the
-#built plugin has then to be found under "$$BUILD_DIR/plugins/qtivi/".
-#There is a line in the backend plugin's .pro file that places the plugin under
-#"$$BUILD_DIR/plugins/" when building for android
- ANDROID_EXTRA_PLUGINS = $$BUILD_DIR/plugins/
-}
+android: QT += remoteobjects
HEADERS += \
client.h
diff --git a/src/remotesettings/app/main.cpp b/src/remotesettings/app/main.cpp
index daa26731..fdc99c88 100644
--- a/src/remotesettings/app/main.cpp
+++ b/src/remotesettings/app/main.cpp
@@ -33,6 +33,7 @@
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QDir>
+#include <QtCore/QCommandLineParser>
#include <QtIviCore/QtIviCoreVersion>
#include "client.h"
@@ -43,9 +44,27 @@
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
+ QCoreApplication::setApplicationName(QStringLiteral("Neptune Companion"));
+ QCoreApplication::setOrganizationName(QStringLiteral("Luxoft Sweden AB"));
+ QCoreApplication::setOrganizationDomain(QStringLiteral("luxoft.com"));
QCoreApplication::setApplicationVersion(STR(NEPTUNE_COMPANION_APP_VERSION));
QGuiApplication app(argc, argv);
+ QCommandLineParser cmdParser;
+ cmdParser.setApplicationDescription(
+ "Neptune Companion\n\n"
+ "Logging is turned off by default, to control log output please check command line "
+ "options or Qt Help for QT_LOGGING_RULES environment variable.\n");
+ cmdParser.addHelpOption();
+ cmdParser.addVersionOption();
+ const QCommandLineOption enableDefaultLoggingOption("verbose",
+ "Enables default Qt logging filter.");
+ cmdParser.addOption(enableDefaultLoggingOption);
+ cmdParser.process(app);
+ if (!cmdParser.isSet(enableDefaultLoggingOption)) {
+ QLoggingCategory::setFilterRules("*=false");
+ }
+
Client client;
QQmlApplicationEngine engine;
diff --git a/src/remotesettings/app/main.qml b/src/remotesettings/app/main.qml
index 95d0b80f..d677b1e4 100644
--- a/src/remotesettings/app/main.qml
+++ b/src/remotesettings/app/main.qml
@@ -143,7 +143,7 @@ ApplicationWindow {
Connections {
target: client
- onServerUrlChanged: {
+ function onServerUrlChanged() {
if (client.serverUrl.toString().length)
connectionDialog.url = client.serverUrl.toString();
else
@@ -153,7 +153,7 @@ ApplicationWindow {
Connections {
target: client
- onConnectedChanged: {
+ function onConnectedChanged() {
if (client.connected)
connectionDialog.close();
}
diff --git a/src/remotesettings/backend/backend.pro b/src/remotesettings/backend/backend.pro
index 18d6ca26..689437fc 100644
--- a/src/remotesettings/backend/backend.pro
+++ b/src/remotesettings/backend/backend.pro
@@ -1,5 +1,5 @@
TEMPLATE=lib
-TARGET = $$qtLibraryTarget(remotesettings_backend_qtro)
+TARGET = $$qt5LibraryTarget(remotesettings_backend_qtro, "plugins/qtivi/")
CONFIG += ivigenerator plugin
QT_FOR_CONFIG += ivicore
diff --git a/src/src.pro b/src/src.pro
index 3b496a5f..85df6c3c 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -5,6 +5,11 @@ SUBDIRS += remotesettings \
drivedata \
connectivity
+linux|macos:{
+ SUBDIRS += neptune-cluster-app
+ neptune-cluster-app.depends = neptune3-ui drivedata remotesettings
+}
+
#build Qt Safe Renderer Cluster
qtHaveModule(qtsaferenderer):load(qtsaferenderer-tools):qtsaferenderer-tools-available {
SUBDIRS += neptune3-ui-qsr-cluster
diff --git a/styles/lucee/Button.qml b/styles/lucee/Button.qml
index 1f936a9a..18c8676b 100644
--- a/styles/lucee/Button.qml
+++ b/styles/lucee/Button.qml
@@ -57,6 +57,10 @@ T.Button {
icon.color: Style.contrastColor
Cursor {
+ onActivated: {
+ control.clicked();
+ }
+
onPressAndHold: {
control.pressAndHold();
}
diff --git a/styles/lucee/ComboBox.qml b/styles/lucee/ComboBox.qml
index 74389bec..5bf320de 100644
--- a/styles/lucee/ComboBox.qml
+++ b/styles/lucee/ComboBox.qml
@@ -54,7 +54,11 @@ T.ComboBox {
leftPadding: padding + (!control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
rightPadding: padding + (control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
- Cursor { }
+ Cursor {
+ onActivated: {
+ control.clicked();
+ }
+ }
delegate: ItemDelegate {
width: parent.width
diff --git a/styles/lucee/ItemDelegate.qml b/styles/lucee/ItemDelegate.qml
index ed133668..f2a550db 100644
--- a/styles/lucee/ItemDelegate.qml
+++ b/styles/lucee/ItemDelegate.qml
@@ -60,6 +60,9 @@ T.ItemDelegate {
font.weight: Font.Light
Cursor {
+ onActivated: {
+ control.clicked();
+ }
onPressAndHold: {
control.pressAndHold();
}
diff --git a/styles/lucee/RadioButton.qml b/styles/lucee/RadioButton.qml
index 842c62e8..b24f8f9c 100644
--- a/styles/lucee/RadioButton.qml
+++ b/styles/lucee/RadioButton.qml
@@ -52,6 +52,9 @@ T.RadioButton {
spacing: Sizes.dp(8)
Cursor {
+ onActivated: {
+ control.clicked();
+ }
onPressAndHold: {
control.pressAndHold();
}
diff --git a/styles/lucee/Switch.qml b/styles/lucee/Switch.qml
index a3afb078..6bdaff47 100644
--- a/styles/lucee/Switch.qml
+++ b/styles/lucee/Switch.qml
@@ -63,6 +63,9 @@ T.Switch {
spacing: Sizes.dp(8)
Cursor {
+ onActivated: {
+ control.toggle();
+ }
onPressAndHold: {
control.pressAndHold();
}
diff --git a/styles/lucee/SwitchDelegate.qml b/styles/lucee/SwitchDelegate.qml
index b66d0f14..d8321ca9 100644
--- a/styles/lucee/SwitchDelegate.qml
+++ b/styles/lucee/SwitchDelegate.qml
@@ -61,7 +61,11 @@ T.SwitchDelegate {
font.family: Style.fontFamily
font.weight: Font.Light
- Cursor { }
+ Cursor {
+ onActivated: {
+ control.toggle();
+ }
+ }
indicator: PaddedRectangle {
implicitWidth: Sizes.dp(56)
diff --git a/styles/lucee/TabButton.qml b/styles/lucee/TabButton.qml
index 2fb20590..a4aa7589 100644
--- a/styles/lucee/TabButton.qml
+++ b/styles/lucee/TabButton.qml
@@ -60,6 +60,10 @@ T.TabButton {
font.weight: selected ? Font.Normal : Font.Light
Cursor {
+ onActivated: {
+ control.clicked();
+ }
+
onPressAndHold: {
control.pressAndHold();
}
diff --git a/styles/lucee/ToolButton.qml b/styles/lucee/ToolButton.qml
index dfa899cf..55efd6c6 100644
--- a/styles/lucee/ToolButton.qml
+++ b/styles/lucee/ToolButton.qml
@@ -31,9 +31,9 @@
****************************************************************************/
import QtQuick 2.10
-import QtQuick.Templates 2.3 as T
-import QtQuick.Controls 2.3
-import QtQuick.Controls.impl 2.3
+import QtQuick.Templates 2.5 as T
+import QtQuick.Controls 2.5
+import QtQuick.Controls.impl 2.5
import shared.utils 1.0
import shared.controls 1.0
@@ -43,10 +43,10 @@ import shared.Sizes 1.0
T.ToolButton {
id: control
- implicitWidth: Math.max(background ? background.implicitWidth : 0,
- contentItem ? contentItem.implicitWidth + leftPadding + rightPadding : 0)
- implicitHeight: Math.max(background ? background.implicitHeight : 0,
- contentItem ? contentItem.implicitHeight + topPadding + bottomPadding : 0)
+ implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+ implicitContentWidth + leftPadding + rightPadding)
+ implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+ implicitContentHeight + topPadding + bottomPadding)
baselineOffset: contentItem ? contentItem.y + contentItem.baselineOffset : 0
padding: Sizes.dp(6)
@@ -58,15 +58,26 @@ T.ToolButton {
icon.color: (checked || highlighted) ? Style.accentColor : Style.contrastColor
scale: pressed ? 1.1 : 1.0
+
+ property alias iconFillMode: iconLabel.iconFillMode
+ property alias iconRectWidth: iconLabel.iconRectWidth
+ property alias iconRectHeight: iconLabel.iconRectHeight
+
Behavior on scale { NumberAnimation { duration: 50 } }
Cursor {
+ onActivated: {
+ control.clicked();
+ }
+
onPressAndHold: {
control.pressAndHold();
}
}
contentItem: NeptuneIconLabel {
+ id: iconLabel
+
readonly property real textOpacity: !enabled ? Style.defaultDisabledOpacity
: control.checkable && !control.checked && control.display === AbstractButton.TextUnderIcon // ToolsColumn
? Style.opacityLow : Style.opacityHigh
diff --git a/styles/lucee/images/colorSelector/#51a7f4.png b/styles/lucee/images/colorSelector/#51a7f4.png
new file mode 100644
index 00000000..ac8ef8ac
--- /dev/null
+++ b/styles/lucee/images/colorSelector/#51a7f4.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:167d3a38e56169ac1ef857134c84691b6bf309561555696a05e59a2392588840
+size 9050
diff --git a/styles/lucee/images/colorSelector/#535258.png b/styles/lucee/images/colorSelector/#535258.png
new file mode 100644
index 00000000..3463d5d8
--- /dev/null
+++ b/styles/lucee/images/colorSelector/#535258.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d5ad586afe62fbb4604f2839c24238dc46e7c8b88e4250c2b013601451378f7e
+size 7776
diff --git a/styles/lucee/images/colorSelector/#78887b.png b/styles/lucee/images/colorSelector/#78887b.png
new file mode 100644
index 00000000..f6401303
--- /dev/null
+++ b/styles/lucee/images/colorSelector/#78887b.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:12f968b15cd9c935b7f92f556ec3c9085c7af4802041c31ad8138518bb19f774
+size 7814
diff --git a/styles/lucee/images/colorSelector/#7ba2a5.png b/styles/lucee/images/colorSelector/#7ba2a5.png
new file mode 100644
index 00000000..6f3efb46
--- /dev/null
+++ b/styles/lucee/images/colorSelector/#7ba2a5.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:df8a1ee0289e42c38d4f69875fd2958f84329c8bc85bb53c1e30d42d457599e1
+size 8863
diff --git a/styles/lucee/images/colorSelector/#9eae83.png b/styles/lucee/images/colorSelector/#9eae83.png
new file mode 100644
index 00000000..c902d564
--- /dev/null
+++ b/styles/lucee/images/colorSelector/#9eae83.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:73da68365ce4a133299b17fac34a0ae55a5901fddc400199927060b414693c18
+size 8717
diff --git a/styles/lucee/images/colorSelector/#d35756.png b/styles/lucee/images/colorSelector/#d35756.png
new file mode 100644
index 00000000..5bb7f192
--- /dev/null
+++ b/styles/lucee/images/colorSelector/#d35756.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e70c926a2aac3c33a7a28e3cc95969144cf38efd6807015c25458ffb37776e3a
+size 7503
diff --git a/styles/lucee/images/colorSelector/#db3b9f.png b/styles/lucee/images/colorSelector/#db3b9f.png
new file mode 100644
index 00000000..ec052635
--- /dev/null
+++ b/styles/lucee/images/colorSelector/#db3b9f.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1cc6d2c634a096236b11c4214483f66101a2dbaf41164a246884313954a83b8a
+size 7301
diff --git a/styles/lucee/images/colorSelector/#fba054.png b/styles/lucee/images/colorSelector/#fba054.png
new file mode 100644
index 00000000..b46f6d2b
--- /dev/null
+++ b/styles/lucee/images/colorSelector/#fba054.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bcc626f301ea06e8aa11d311407a1e3ff80f6ccf003d7a3d7f7fbb4028323d11
+size 8323
diff --git a/styles/lucee/images/colorSelector/color-wheel.png b/styles/lucee/images/colorSelector/color-wheel.png
new file mode 100644
index 00000000..923de750
--- /dev/null
+++ b/styles/lucee/images/colorSelector/color-wheel.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e0b9e1ba99284620943a3d7f1a752929ad142e54a2a37665f422e40af34fc9d6
+size 25689
diff --git a/styles/lucee/images/logo-kdab.png b/styles/lucee/images/logo-kdab.png
index 10cfd84e..99e67295 100644
--- a/styles/lucee/images/logo-kdab.png
+++ b/styles/lucee/images/logo-kdab.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ccd227efaf6ae27ea455fcfd59b1b8c8bc8993908783ee1a057920303ed4ef3a
-size 13866
+oid sha256:c010a10f9fe3b35aed0792cc79d18143dc88aadc083d37bbb7f6ac29438f5486
+size 7211
diff --git a/styles/lucee/images/logo-luxoft.png b/styles/lucee/images/logo-luxoft.png
index f0d61e2e..285be51f 100644
--- a/styles/lucee/images/logo-luxoft.png
+++ b/styles/lucee/images/logo-luxoft.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2017b636be882d808616a04708d0162809179a18fc93f6ac395b16cbe4ea2a1b
-size 7285
+oid sha256:c652e9a0dd609929449ed0ea651fe8aeb2eebe33dde51e0150c74ccd7c385262
+size 15690
diff --git a/styles/lucee/images/logo-theqtcompany.png b/styles/lucee/images/logo-theqtcompany.png
index dd844267..d36228b3 100644
--- a/styles/lucee/images/logo-theqtcompany.png
+++ b/styles/lucee/images/logo-theqtcompany.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c6a60de402e3292c88f4333e3c74746d66efdd9b731a84d78d4bf6bd81d40493
-size 15405
+oid sha256:625593cf8b692fa091a5a42cfc8386b59e4eb1b948a187dbdd3e40ffae8f425a
+size 8554
diff --git a/styles/lucee/images/luxoft-footer.png b/styles/lucee/images/luxoft-footer.png
index 6d752964..285be51f 100644
--- a/styles/lucee/images/luxoft-footer.png
+++ b/styles/lucee/images/luxoft-footer.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:eaebc43c8dfefae428c7f9f084b064ee5a743883b9eacf71176728924718bf6f
-size 1524
+oid sha256:c652e9a0dd609929449ed0ea651fe8aeb2eebe33dde51e0150c74ccd7c385262
+size 15690
diff --git a/styles/lucee/style.conf b/styles/lucee/style.conf
index 78bd9d41..b5d943eb 100644
--- a/styles/lucee/style.conf
+++ b/styles/lucee/style.conf
@@ -1,7 +1,7 @@
Theme=Light
-AccentColor=#FF67A61C
[Light]
+AccentColor=#fba054
BackgroundColor=#FFF1EFED
ButtonColor=#FF969696
HighlightedButtonColor=#FFCBCAC8
diff --git a/styles/neptune/Button.qml b/styles/neptune/Button.qml
index 1f936a9a..18c8676b 100644
--- a/styles/neptune/Button.qml
+++ b/styles/neptune/Button.qml
@@ -57,6 +57,10 @@ T.Button {
icon.color: Style.contrastColor
Cursor {
+ onActivated: {
+ control.clicked();
+ }
+
onPressAndHold: {
control.pressAndHold();
}
diff --git a/styles/neptune/ItemDelegate.qml b/styles/neptune/ItemDelegate.qml
index ed133668..abc101ee 100644
--- a/styles/neptune/ItemDelegate.qml
+++ b/styles/neptune/ItemDelegate.qml
@@ -60,6 +60,10 @@ T.ItemDelegate {
font.weight: Font.Light
Cursor {
+ onActivated: {
+ control.clicked();
+ }
+
onPressAndHold: {
control.pressAndHold();
}
diff --git a/styles/neptune/RadioButton.qml b/styles/neptune/RadioButton.qml
index 842c62e8..466a791b 100644
--- a/styles/neptune/RadioButton.qml
+++ b/styles/neptune/RadioButton.qml
@@ -52,6 +52,10 @@ T.RadioButton {
spacing: Sizes.dp(8)
Cursor {
+ onActivated: {
+ control.clicked();
+ }
+
onPressAndHold: {
control.pressAndHold();
}
diff --git a/styles/neptune/Switch.qml b/styles/neptune/Switch.qml
index e4843163..2a906fc0 100644
--- a/styles/neptune/Switch.qml
+++ b/styles/neptune/Switch.qml
@@ -63,6 +63,10 @@ T.Switch {
spacing: Sizes.dp(8)
Cursor {
+ onActivated: {
+ control.toggle();
+ }
+
onPressAndHold: {
control.pressAndHold();
}
diff --git a/styles/neptune/SwitchDelegate.qml b/styles/neptune/SwitchDelegate.qml
index ffb11e30..563a8e51 100644
--- a/styles/neptune/SwitchDelegate.qml
+++ b/styles/neptune/SwitchDelegate.qml
@@ -61,7 +61,11 @@ T.SwitchDelegate {
font.family: Style.fontFamily
font.weight: Font.Light
- Cursor { }
+ Cursor {
+ onActivated: {
+ control.toggle();
+ }
+ }
indicator: PaddedRectangle {
implicitWidth: Sizes.dp(56)
diff --git a/styles/neptune/TabButton.qml b/styles/neptune/TabButton.qml
index cf84ee1b..7b0b5d05 100644
--- a/styles/neptune/TabButton.qml
+++ b/styles/neptune/TabButton.qml
@@ -59,6 +59,9 @@ T.TabButton {
font.weight: selected ? Font.Normal : Font.Light
Cursor {
+ onActivated: {
+ control.clicked();
+ }
onPressAndHold: {
control.pressAndHold();
}
diff --git a/styles/neptune/ToolButton.qml b/styles/neptune/ToolButton.qml
index 9c721440..55efd6c6 100644
--- a/styles/neptune/ToolButton.qml
+++ b/styles/neptune/ToolButton.qml
@@ -31,9 +31,9 @@
****************************************************************************/
import QtQuick 2.10
-import QtQuick.Templates 2.3 as T
-import QtQuick.Controls 2.3
-import QtQuick.Controls.impl 2.3
+import QtQuick.Templates 2.5 as T
+import QtQuick.Controls 2.5
+import QtQuick.Controls.impl 2.5
import shared.utils 1.0
import shared.controls 1.0
@@ -43,10 +43,10 @@ import shared.Sizes 1.0
T.ToolButton {
id: control
- implicitWidth: Math.max(background ? background.implicitWidth : 0,
- contentItem ? contentItem.implicitWidth + leftPadding + rightPadding : 0)
- implicitHeight: Math.max(background ? background.implicitHeight : 0,
- contentItem ? contentItem.implicitHeight + topPadding + bottomPadding : 0)
+ implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+ implicitContentWidth + leftPadding + rightPadding)
+ implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+ implicitContentHeight + topPadding + bottomPadding)
baselineOffset: contentItem ? contentItem.y + contentItem.baselineOffset : 0
padding: Sizes.dp(6)
@@ -59,15 +59,25 @@ T.ToolButton {
scale: pressed ? 1.1 : 1.0
+ property alias iconFillMode: iconLabel.iconFillMode
+ property alias iconRectWidth: iconLabel.iconRectWidth
+ property alias iconRectHeight: iconLabel.iconRectHeight
+
Behavior on scale { NumberAnimation { duration: 50 } }
Cursor {
+ onActivated: {
+ control.clicked();
+ }
+
onPressAndHold: {
control.pressAndHold();
}
}
contentItem: NeptuneIconLabel {
+ id: iconLabel
+
readonly property real textOpacity: !enabled ? Style.defaultDisabledOpacity
: control.checkable && !control.checked && control.display === AbstractButton.TextUnderIcon // ToolsColumn
? Style.opacityLow : Style.opacityHigh
diff --git a/styles/neptune/images/colorSelector/#087559.png b/styles/neptune/images/colorSelector/#087559.png
index 56bd7f7e..a162669e 100644
--- a/styles/neptune/images/colorSelector/#087559.png
+++ b/styles/neptune/images/colorSelector/#087559.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:df8d330c009d9dc856f5a2788dfbb440fa38ce629c923a72c20aba3eb37c6a61
-size 24723
+oid sha256:b2b2845d2df523b2bb92b32e62719ef598c616e94b4109f3376064e2b68a617b
+size 257
diff --git a/styles/neptune/images/colorSelector/#417eb6.png b/styles/neptune/images/colorSelector/#417eb6.png
index 97c81993..055d1b84 100644
--- a/styles/neptune/images/colorSelector/#417eb6.png
+++ b/styles/neptune/images/colorSelector/#417eb6.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:702ae95c5cfedac4ac5b645d05ba568ec6d5e52efbdb5caed294ff659b9a4c46
-size 22717
+oid sha256:f1f853cab7785eb257c9c27487c03d8036d7ea52a4b7dec656070fb7e7943d51
+size 257
diff --git a/styles/neptune/images/colorSelector/#4c878b.png b/styles/neptune/images/colorSelector/#4c878b.png
index d6b8c344..ec5cecac 100644
--- a/styles/neptune/images/colorSelector/#4c878b.png
+++ b/styles/neptune/images/colorSelector/#4c878b.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:da884caaafd87eb28abd3c91274c5440bd2b412cc1a0d0b642cad2a3cc7ac460
-size 23564
+oid sha256:78ae36465a08af2da7cd60d44f30ffda00a6c5a0cc98e53e6775c7d189a7288e
+size 257
diff --git a/styles/neptune/images/colorSelector/#4f4c4a.png b/styles/neptune/images/colorSelector/#4f4c4a.png
index dff6cd1b..03ef8162 100644
--- a/styles/neptune/images/colorSelector/#4f4c4a.png
+++ b/styles/neptune/images/colorSelector/#4f4c4a.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:70792aeda8b02ad491fa354f483d3de6920b4b105cbc1ba2b8c132c856cd2213
-size 23689
+oid sha256:3f577d358ad8313348c3de119fc8227d2a3f86acf20091bd53f9fa1b05c1912a
+size 257
diff --git a/styles/neptune/images/colorSelector/#51a7f4.png b/styles/neptune/images/colorSelector/#51a7f4.png
index bd254df3..766d3a77 100644
--- a/styles/neptune/images/colorSelector/#51a7f4.png
+++ b/styles/neptune/images/colorSelector/#51a7f4.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2f95d42c7b69c1498b22f74acded592bdc655043f41857f9cbab4ce7fd0dcbf6
-size 23598
+oid sha256:cbb1f7335b488867dad05bf7ebe65738254d05c1c20581fc79cafaee047a75ff
+size 257
diff --git a/styles/neptune/images/colorSelector/#535258.png b/styles/neptune/images/colorSelector/#535258.png
index de45c6ab..338c6700 100644
--- a/styles/neptune/images/colorSelector/#535258.png
+++ b/styles/neptune/images/colorSelector/#535258.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5f253cb692517e06c5feac2dcf5217c6411fdc984d858a059b0915093325c330
-size 22841
+oid sha256:f8f4460625f2e473f58f2f70509c2478318652b5ee5b58692290b5a40a176b2d
+size 257
diff --git a/styles/neptune/images/colorSelector/#698563.png b/styles/neptune/images/colorSelector/#698563.png
index 7330e8a0..bc9e9536 100644
--- a/styles/neptune/images/colorSelector/#698563.png
+++ b/styles/neptune/images/colorSelector/#698563.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:93d3259208844487996c405454f1036057ba7b4eb384e14d00252a6455727040
-size 22297
+oid sha256:714b46f826ca46fe894192e67cbc94ea953c2cf421aca34b8d64150e91b2d8f0
+size 257
diff --git a/styles/neptune/images/colorSelector/#78887b.png b/styles/neptune/images/colorSelector/#78887b.png
index b7bc4bbe..fa9e13cf 100644
--- a/styles/neptune/images/colorSelector/#78887b.png
+++ b/styles/neptune/images/colorSelector/#78887b.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:46da0efd2c5311d3af54b3352d6143ce596c5663289fb9b2ea176e5fe0bedfdd
-size 22275
+oid sha256:1de8160b624bb282f65c023c22ec5e5be7c486d37acae4b2a37efc3fcbc83a4d
+size 257
diff --git a/styles/neptune/images/colorSelector/#7ba2a5.png b/styles/neptune/images/colorSelector/#7ba2a5.png
index 3004fb92..a35edff0 100644
--- a/styles/neptune/images/colorSelector/#7ba2a5.png
+++ b/styles/neptune/images/colorSelector/#7ba2a5.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:46b3ce57f1894c44cab5344f8b230576c5025804acdb18bf3c002249fc49c4af
-size 24955
+oid sha256:f9a9c77660e1420b6bb7f7eb3e18c9c58aada5802cf0e91f651933ddcd8bb018
+size 257
diff --git a/styles/neptune/images/colorSelector/#916755.png b/styles/neptune/images/colorSelector/#916755.png
index 6d59f111..d0445cfd 100644
--- a/styles/neptune/images/colorSelector/#916755.png
+++ b/styles/neptune/images/colorSelector/#916755.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6131ff97e05f0b98e922a8e9c8520ffe68bc906bba2d1c5961071e5cdb414dc1
-size 25333
+oid sha256:46cc000a9702709887891e8dc4bf36d3f5656d7129858e29cc0fa5e61c98ec79
+size 257
diff --git a/styles/neptune/images/colorSelector/#977b35.png b/styles/neptune/images/colorSelector/#977b35.png
index 81c03b86..53dd3955 100644
--- a/styles/neptune/images/colorSelector/#977b35.png
+++ b/styles/neptune/images/colorSelector/#977b35.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7a6e442e6796b81df21b26186c6324f6db860bd26a4ada30ca669a66ab07e8db
-size 26211
+oid sha256:5d1c4e82c69d82ab7c1280cd2745d8b95d87192102d129d0e2038ba94f4f05cb
+size 257
diff --git a/styles/neptune/images/colorSelector/#9eae83.png b/styles/neptune/images/colorSelector/#9eae83.png
index add478cf..1ebe4288 100644
--- a/styles/neptune/images/colorSelector/#9eae83.png
+++ b/styles/neptune/images/colorSelector/#9eae83.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ddb2570d34d386e2b574e0ec63204ad81118b1c695fb5eacfe00b5d943c65045
-size 26422
+oid sha256:a56f5ff39d4560c4cc9554faedd395ed04603752aeb9f5806a25b2ba7b31ae01
+size 257
diff --git a/styles/neptune/images/colorSelector/#b75034.png b/styles/neptune/images/colorSelector/#b75034.png
index a221521a..0e7033e3 100644
--- a/styles/neptune/images/colorSelector/#b75034.png
+++ b/styles/neptune/images/colorSelector/#b75034.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:752f5d753f198e0dc35d7a6edcf988663bd4b89f4d5f2c75525165e754060830
-size 23277
+oid sha256:93f93260d8b4247910c43c1fa5f22dbeb5097d8c1d55927c99be54e856861a27
+size 257
diff --git a/styles/neptune/images/colorSelector/#d35756.png b/styles/neptune/images/colorSelector/#d35756.png
index 91803177..1b975cc7 100644
--- a/styles/neptune/images/colorSelector/#d35756.png
+++ b/styles/neptune/images/colorSelector/#d35756.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c2603b3d079d038761a4b7c62f323996498350831cef28db58b33d7e8fc40480
-size 23173
+oid sha256:2a295f43cf45825668316420df405889ccc11e82d899668929168c20682d3fb4
+size 257
diff --git a/styles/neptune/images/colorSelector/#db3b9f.png b/styles/neptune/images/colorSelector/#db3b9f.png
index 79c5b540..deb90d1a 100644
--- a/styles/neptune/images/colorSelector/#db3b9f.png
+++ b/styles/neptune/images/colorSelector/#db3b9f.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:82d60a33f8b16c55887a5983cfdd4615a161d237d3d24db4de1df2d5f78c54dc
-size 23879
+oid sha256:22a777d0160ac99fa023b0d6df32b9ea05ea7db41205a914f48262e1b10d4ba8
+size 257
diff --git a/styles/neptune/images/colorSelector/#fba054.png b/styles/neptune/images/colorSelector/#fba054.png
index aff2e969..f983197d 100644
--- a/styles/neptune/images/colorSelector/#fba054.png
+++ b/styles/neptune/images/colorSelector/#fba054.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:84c345395a7de785552ef58e231ce0a0fc34c5c38eff4ba1edce3d0d13e672ec
-size 25211
+oid sha256:1c90e840bb1c129f8a8990e3523a4ff680ec8100bfac6bf3e50d77ac2e1f7a4f
+size 257
diff --git a/styles/neptune/images/colorSelector/color-wheel-dark.png b/styles/neptune/images/colorSelector/color-wheel-dark.png
index 890a0b48..2cf92998 100644
--- a/styles/neptune/images/colorSelector/color-wheel-dark.png
+++ b/styles/neptune/images/colorSelector/color-wheel-dark.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:711921573018521d44f694c3652930e9ceac7588f202ef4e0a92b590c5e45348
-size 38216
+oid sha256:bf54abd7224bbca7061a2cfe83a467e6ea88766f42a0eaab016f8d2fc002b0b3
+size 258
diff --git a/styles/neptune/images/colorSelector/color-wheel.png b/styles/neptune/images/colorSelector/color-wheel.png
index 79466fae..5838acc8 100644
--- a/styles/neptune/images/colorSelector/color-wheel.png
+++ b/styles/neptune/images/colorSelector/color-wheel.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e4a31577e3ea41b34cf619e60e199cd529da2dcb2611211487fb2986004f3377
-size 38001
+oid sha256:f77a9fb5275e2c7d7a35e4584cca714f458d34b42f1177d09685fea5ff13b35f
+size 258
diff --git a/styles/neptune/images/instrument-cluster-bg-dark.png b/styles/neptune/images/instrument-cluster-bg-dark.png
index 455e3f19..1a89136b 100644
--- a/styles/neptune/images/instrument-cluster-bg-dark.png
+++ b/styles/neptune/images/instrument-cluster-bg-dark.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d2ca3af5f2b9500b04e330ef472032a1c4bc47e1030720e53a97330cb9a4b842
-size 635155
+oid sha256:5e9cd6b2b43dd098048a356c34656d8bd1f79431d5ae24f59324f4b22bb2986a
+size 1317807
diff --git a/styles/neptune/images/logo-kdab-dark.png b/styles/neptune/images/logo-kdab-dark.png
new file mode 100644
index 00000000..1f440c21
--- /dev/null
+++ b/styles/neptune/images/logo-kdab-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5996e07d3260ae429e43cea57a56e40ea1c4ca4b21836b7a6e9a72019f8d792d
+size 6706
diff --git a/styles/neptune/images/logo-kdab.png b/styles/neptune/images/logo-kdab.png
index 10cfd84e..99e67295 100644
--- a/styles/neptune/images/logo-kdab.png
+++ b/styles/neptune/images/logo-kdab.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ccd227efaf6ae27ea455fcfd59b1b8c8bc8993908783ee1a057920303ed4ef3a
-size 13866
+oid sha256:c010a10f9fe3b35aed0792cc79d18143dc88aadc083d37bbb7f6ac29438f5486
+size 7211
diff --git a/styles/neptune/images/logo-luxoft-dark.png b/styles/neptune/images/logo-luxoft-dark.png
new file mode 100644
index 00000000..792f1114
--- /dev/null
+++ b/styles/neptune/images/logo-luxoft-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4abc11c9f3b628eef3df8d5b65491e71fe045b9482bcb536523f91bfa91d65b4
+size 10740
diff --git a/styles/neptune/images/logo-luxoft.png b/styles/neptune/images/logo-luxoft.png
index f0d61e2e..285be51f 100644
--- a/styles/neptune/images/logo-luxoft.png
+++ b/styles/neptune/images/logo-luxoft.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2017b636be882d808616a04708d0162809179a18fc93f6ac395b16cbe4ea2a1b
-size 7285
+oid sha256:c652e9a0dd609929449ed0ea651fe8aeb2eebe33dde51e0150c74ccd7c385262
+size 15690
diff --git a/styles/neptune/images/logo-theqtcompany-dark.png b/styles/neptune/images/logo-theqtcompany-dark.png
new file mode 100644
index 00000000..276617b6
--- /dev/null
+++ b/styles/neptune/images/logo-theqtcompany-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:30124653e0c60670897abc49e7328bd99959928a97fafeb9ab6f7f53e2912b4b
+size 5764
diff --git a/styles/neptune/images/logo-theqtcompany.png b/styles/neptune/images/logo-theqtcompany.png
index dd844267..d36228b3 100644
--- a/styles/neptune/images/logo-theqtcompany.png
+++ b/styles/neptune/images/logo-theqtcompany.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c6a60de402e3292c88f4333e3c74746d66efdd9b731a84d78d4bf6bd81d40493
-size 15405
+oid sha256:625593cf8b692fa091a5a42cfc8386b59e4eb1b948a187dbdd3e40ffae8f425a
+size 8554
diff --git a/styles/neptune/style.conf b/styles/neptune/style.conf
index 16b9996f..88283ef2 100644
--- a/styles/neptune/style.conf
+++ b/styles/neptune/style.conf
@@ -1,7 +1,7 @@
Theme=Dark
-AccentColor=#FFB75034
[Light]
+AccentColor=#fba054
BackgroundColor=#FFF1EFED
ButtonColor=#FF969696
HighlightedButtonColor=#FFCBCAC8
@@ -17,6 +17,7 @@ DefaultDisabledOpacity=0.3
FontFamily="DejaVu Sans"
[Dark]
+AccentColor=#087559
BackgroundColor=#FF5E5954
ButtonColor=#FF969696
HighlightedButtonColor=#FF6D6B64
diff --git a/sysui/about/About.qml b/sysui/about/About.qml
index 1ceb4a81..b47f7274 100644
--- a/sysui/about/About.qml
+++ b/sysui/about/About.qml
@@ -31,6 +31,7 @@
****************************************************************************/
import QtQuick 2.10
+import QtQml 2.14
import system.controls 1.0
@@ -51,7 +52,16 @@ PopupItemLoader {
state: item ? item.state : ""
readonly property string currentTabName: item ? item.currentTabName : ""
- Binding { target: root.item; property: "applicationModel"; value: root.applicationModel }
- Binding { target: root.item; property: "systemModel"; value: root.systemModel }
- Binding { target: root.item; property: "sysInfo"; value: root.sysInfo }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: root.item; property: "applicationModel"; value: root.applicationModel;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: root.item; property: "systemModel"; value: root.systemModel;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: root.item; property: "sysInfo"; value: root.sysInfo;
+ }
}
diff --git a/sysui/about/AboutApps.qml b/sysui/about/AboutApps.qml
index 237dc0c8..efaa7d61 100644
--- a/sysui/about/AboutApps.qml
+++ b/sysui/about/AboutApps.qml
@@ -31,6 +31,7 @@
****************************************************************************/
import QtQuick 2.8
+import QtQml 2.14
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3
import QtApplicationManager.SystemUI 2.0
@@ -47,6 +48,28 @@ Item {
property var applicationModel
+ function isPackageBuiltIn(appId) {
+ var app = ApplicationManager.application(appId)
+ return app && app.builtIn;
+ }
+
+ function isApplicationBusy(appId) {
+ var taskIds = ApplicationInstaller.activeTaskIds()
+ if (taskIds.includes(appId)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ function uninstallApplication(appId) {
+ if (isApplicationBusy(appId)) {
+ console.warn("Application busy... Abort uninstall", appId);
+ return;
+ }
+ ApplicationInstaller.removePackage(appId, false /*keepDocuments*/, true /*force*/);
+ }
+
Instantiator {
model: root.applicationModel
delegate: QtObject {
@@ -63,7 +86,7 @@ Item {
Connections {
target: applicationModel
ignoreUnknownSignals: true
- onAppRemoved: {
+ function onAppRemoved(appInfo) {
runningAppsModel.removeAppInfo(appInfo)
}
}
@@ -136,7 +159,7 @@ Item {
id: listView
clip: true
model: runningAppsModel
- spacing: Sizes.dp(20)
+ spacing: Sizes.dp(10)
anchors.top: infoLabel.bottom
anchors.topMargin: Sizes.dp(30)
anchors.left: parent.left
@@ -150,8 +173,9 @@ Item {
id: itemDelegate
Item {
id: delegateRoot
+
width: parent.width
- implicitHeight: Sizes.dp(240)
+ implicitHeight: Sizes.dp(265)
function getWindowTypeName(window) {
@@ -178,7 +202,7 @@ Item {
Timer {
interval: 1000
- running: root.visible
+ running: root.visible && model.appInfo.running
repeat: true
onTriggered: {
processStatus.update()
@@ -186,119 +210,174 @@ Item {
}
}
- ToolButton {
- anchors.verticalCenter: delegateRoot.verticalCenter
- anchors.right: parent.right
- anchors.rightMargin: Sizes.dp(20)
- icon.name: appInfo.running ? "ic-close" : "ic-start"
- onClicked: appInfo.running ? model.appInfo.stop() : model.appInfo.start()
- }
+ ColumnLayout {
+ anchors.fill: parent; spacing: 0.0
- Column {
- id: column
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.rightMargin: Sizes.dp(60)
- anchors.verticalCenter: delegateRoot.verticalCenter
+ RowLayout{
+ Label {
+ text: model.appInfo ? model.appInfo.name : qsTr("Unknown app")
+ Layout.alignment: Qt.AlignVCenter
+ }
- Label {
- text: model.appInfo ? model.appInfo.name : qsTr("Unknown app")
- }
+ Item { Layout.fillWidth: true }
- Row {
- Switch {
- id: autostartSwitch
- font.pixelSize: Sizes.fontSizeXS
- text: qsTr("Autostart")
- opacity: Style.opacityMedium
- Component.onCompleted: {
- checked = model.appInfo.autostart
- }
- onCheckedChanged: {
- root.applicationModel.updateAutostart(model.appInfo.id, checked)
- }
+ ToolButton {
+ icon.name: "ic-remove"
+ visible: appInfo? !root.isPackageBuiltIn(appInfo.id) : false
+ display: NeptuneIconLabel.IconOnly
+ spacing: 0.0; padding: 0.0
+ Layout.alignment: Qt.AlignVCenter; Layout.leftMargin: Sizes.dp(10)
+ onClicked: root.uninstallApplication(appInfo.id)
}
- Switch {
- id: autorecoverSwitch
+
+ Label {
+ text: model.appInfo ? model.appInfo.id : ""
font.pixelSize: Sizes.fontSizeXS
- text: qsTr("Autorecover")
opacity: Style.opacityMedium
- checked: model.appInfo.autorecover
- onCheckedChanged: {
- root.applicationModel.updateAutorecover(model.appInfo.id, autorecoverSwitch.checked)
- }
+ Layout.alignment: Qt.AlignVCenter; Layout.rightMargin: Sizes.dp(20)
}
}
- Label {
- readonly property string memoryPSS: (processStatus.memoryPss.total / 1e6).toFixed(0)
- readonly property string memoryRSS: (processStatus.memoryRss.total / 1e6).toFixed(0)
- readonly property string cpuLoad: (processStatus.cpuLoad * 100).toFixed(1)
- text: qsTr("CPU: %L1 %; RSS: %L3 MB; PSS: %L4 MB").arg(cpuLoad).arg(memoryRSS).arg(memoryPSS)
- font.pixelSize: Sizes.fontSizeS
- opacity: Style.opacityMedium
- visible: model.appInfo.running
+ RowLayout {
+ ColumnLayout {
+ spacing: 0.0
+
+ Label {
+ readonly property string memoryPSS: (processStatus.memoryPss.total
+ / 1e6).toFixed(0)
+ readonly property string memoryRSS: (processStatus.memoryRss.total
+ / 1e6).toFixed(0)
+ readonly property string cpuLoad: (processStatus.cpuLoad
+ * 100).toFixed(1)
+
+ text: qsTr("CPU: %L1 %; RSS: %L3 MB; PSS: %L4 MB")
+ .arg(cpuLoad)
+ .arg(memoryRSS)
+ .arg(memoryPSS)
+ font.pixelSize: Sizes.fontSizeS
+ opacity: model.appInfo.running ? Style.opacityMedium : 0.0
+ Layout.leftMargin: Sizes.dp(40)
+ }
+
+ RowLayout {
+
+ Switch {
+ font.pixelSize: Sizes.fontSizeXS
+ text: qsTr("Autostart")
+ Component.onCompleted: {
+ checked = model.appInfo.autostart
+ }
+ onCheckedChanged: {
+ root.applicationModel.updateAutostart(model.appInfo.id, checked)
+ }
+ }
+
+ Switch {
+ id: autorecoverSwitch
+
+ font.pixelSize: Sizes.fontSizeXS
+ text: qsTr("Autorecover")
+ checked: model.appInfo.autorecover
+ onCheckedChanged: {
+ root.applicationModel.updateAutorecover(model.appInfo.id,
+ autorecoverSwitch.checked)
+ }
+ }
+
+ Item { Layout.fillWidth: true }
+
+ ToolButton {
+ icon.name: appInfo.running ? "ic-close" : "ic-start"
+ display: NeptuneIconLabel.IconOnly
+ font.pixelSize: Sizes.fontSizeXS
+ spacing: 0.0; padding: 0.0
+ Layout.alignment: Qt.AlignVCenter; Layout.rightMargin: Sizes.dp(10)
+ onClicked: {
+ appInfo.running ? model.appInfo.stop() : model.appInfo.start()
+ }
+ }
+ }
+ }
+
+
}
- Column {
- width: parent.width
+ ColumnLayout {
visible: model.appInfo ? !!model.appInfo.window : false
- leftPadding: Sizes.dp(40)
+ spacing: 0.0
+ Layout.fillWidth: true; Layout.leftMargin: Sizes.dp(40)
+
Label {
text: delegateRoot.getWindowTypeName(model.appInfo.window)
font.pixelSize: Sizes.fontSizeS
}
+
RowLayout {
width: parent.width - parent.leftPadding
+
Label {
- Layout.fillWidth: true
- text: qsTr("Time to first frame: %1 ms").arg(model.appInfo.timeToFirstWindowFrame === -1
- ? qsTr("N/A")
- : model.appInfo.timeToFirstWindowFrame)
+ text: qsTr("Time to first frame: %1 ms")
+ .arg(model.appInfo.timeToFirstWindowFrame === -1
+ ? qsTr("N/A")
+ : model.appInfo.timeToFirstWindowFrame)
font.pixelSize: Sizes.fontSizeXS
opacity: Style.opacityMedium
+ Layout.fillWidth: true
}
+
Switch {
id: primarySwitch
+
font.pixelSize: Sizes.fontSizeXS
text: qsTr("Performance monitor")
opacity: Style.opacityMedium
- Binding { target: model.appInfo; property: "windowPerfMonitorEnabled"; value: primarySwitch.checked }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: model.appInfo; property: "windowPerfMonitorEnabled";
+ value: primarySwitch.checked;
+ }
visible: !model.appInfo.isSystemApp
}
}
- bottomPadding: applicationICWindowColumn.visible ? 0 : Sizes.dp(20)
}
- Column {
- id: applicationICWindowColumn
- width: parent.width
+ ColumnLayout {
visible: model.appInfo ? !!model.appInfo.icWindow : false
- leftPadding: Sizes.dp(40)
+ spacing: 0.0
+ Layout.fillWidth: true; Layout.leftMargin: Sizes.dp(40)
+
Label {
text: delegateRoot.getWindowTypeName(model.appInfo.icWindow)
font.pixelSize: Sizes.fontSizeS
}
+
RowLayout {
- width: parent.width - parent.leftPadding
Label {
- Layout.fillWidth: true
- text: qsTr("Time to first frame: %1 ms").arg(model.appInfo.timeToFirstICWindowFrame === -1
- ? qsTr("N/A")
- : model.appInfo.timeToFirstICWindowFrame)
+ text: qsTr("Time to first frame: %1 ms")
+ .arg(model.appInfo.timeToFirstICWindowFrame === -1
+ ? qsTr("N/A")
+ : model.appInfo.timeToFirstICWindowFrame)
font.pixelSize: Sizes.fontSizeXS
opacity: Style.opacityMedium
+ Layout.fillWidth: true
}
+
Switch {
id: secondarySwitch
+
font.pixelSize: Sizes.fontSizeXS
text: qsTr("Performance monitor")
opacity: Style.opacityMedium
- Binding { target: model.appInfo; property: "icWindowPerfMonitorEnabled"; value: secondarySwitch.checked }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: model.appInfo; property: "icWindowPerfMonitorEnabled";
+ value: secondarySwitch.checked;
+ }
}
}
- bottomPadding: Sizes.dp(20)
}
+
+ Item { Layout.fillHeight: true }
}
Image {
diff --git a/sysui/centerconsole/+lucee/CenterConsole.qml b/sysui/centerconsole/+lucee/CenterConsole.qml
index 0303a410..7c943bc6 100644
--- a/sysui/centerconsole/+lucee/CenterConsole.qml
+++ b/sysui/centerconsole/+lucee/CenterConsole.qml
@@ -54,10 +54,10 @@ AbstractCenterConsole {
id: luxoftIcon
anchors.centerIn: bottomBar
source: Style.image("luxoft-footer")
+ fillMode: Image.PreserveAspectFit
+ width: root.width / 6
MouseArea {
anchors.fill: parent
- anchors.topMargin: - Sizes.dp(10)
- anchors.bottomMargin: - Sizes.dp(10)
onClicked: about.open()
}
}
diff --git a/sysui/centerconsole/AbstractCenterConsole.qml b/sysui/centerconsole/AbstractCenterConsole.qml
index bee5d7ea..203c5532 100644
--- a/sysui/centerconsole/AbstractCenterConsole.qml
+++ b/sysui/centerconsole/AbstractCenterConsole.qml
@@ -31,6 +31,7 @@
****************************************************************************/
import QtQuick 2.7
+import QtQml 2.14
import QtGraphicalEffects 1.0
import QtQuick.Controls 2.2
import QtGraphicalEffects 1.0
@@ -57,6 +58,11 @@ Item {
rotation: store.centerConsole.rotation
+ // Default binding, acts like "constrainHeight" to avoid zero sizes when switching
+ // between root states through default state
+ width: root.store.centerConsole.availableWidth
+ height: Math.round(root.width / Config.centerConsoleAspectRatio)
+
// If the Window aspect ratio differs from Config.centerConsoleAspectRatio the Center Console item will be
// letterboxed so that a Config.centerConsoleAspectRatio is preserved.
states: [
@@ -84,8 +90,16 @@ Item {
root.store.languageTimer.start();
}
- Binding { target: root.store.systemStore; property: "activeAppInfo"; value: root.store.applicationModel.activeAppInfo }
- Binding { target: root.store.systemStore; property: "monitorEnabled"; value: about.state === "open" && about.currentTabName === "system" }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: root.store.systemStore; property: "activeAppInfo";
+ value: root.store.applicationModel.activeAppInfo;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: root.store.systemStore; property: "monitorEnabled";
+ value: about.state === "open" && about.currentTabName === "system";
+ }
Image {
anchors.fill: parent
@@ -107,14 +121,42 @@ Item {
source: "MainContentArea.qml"
anchors.fill: parent
- Binding { target: mainContentArea.item; property: "applicationModel"; value: root.store.applicationModel }
- Binding { target: mainContentArea.item; property: "launcherY"; value: statusBar.y + statusBar.height }
- Binding { target: mainContentArea.item; property: "homeBottomMargin"; value: bottomBar.height }
- Binding { target: mainContentArea.item; property: "popupParent"; value: root.popupParent }
- Binding { target: mainContentArea.item; property: "virtualKeyboard"; value: virtualKeyboard.item }
- Binding { target: mainContentArea.item; property: "enableOpacityMask"; value: root.store.hardwareVariant !== 'low' }
- Binding { target: mainContentArea.item; property: "devMode"; value: root.store.devMode }
- Binding { target: mainContentArea.item; property: "showSystemAppsInLauncher"; value: root.store.showSystemAppsInLauncher }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: mainContentArea.item; property: "applicationModel";
+ value: root.store.applicationModel;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: mainContentArea.item; property: "launcherY";
+ value: statusBar.y + statusBar.height;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: mainContentArea.item; property: "homeBottomMargin"; value: bottomBar.height;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: mainContentArea.item; property: "popupParent"; value: root.popupParent;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: mainContentArea.item; property: "virtualKeyboard"; value: virtualKeyboard.item;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: mainContentArea.item; property: "enableOpacityMask";
+ value: root.store.hardwareVariant !== 'low';
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: mainContentArea.item; property: "devMode"; value: root.store.devMode;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: mainContentArea.item; property: "showSystemAppsInLauncher";
+ value: root.store.showSystemAppsInLauncher;
+ }
}
StatusBar {
@@ -136,7 +178,7 @@ Item {
id: bottomBar
width: root.width
height: Sizes.dp(Config.bottomBarHeight)
- enabled: !mainContentArea.item.launcherOpen
+ enabled: mainContentArea.item && !mainContentArea.item.launcherOpen
opacity: enabled ? 1.0 : 0.6
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
@@ -152,11 +194,16 @@ Item {
Loader {
id: virtualKeyboard
+ asynchronous: true
source: "VirtualKeyboard.qml"
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.bottom: parent.bottom
+ anchors.horizontalCenter: root.horizontalCenter
+ anchors.bottom: root.bottom
+ width: root.width
z: 101
+
+ onLoaded: {
+ item.parentRotation = Qt.binding(() => root.rotation);
+ }
}
UIShortcuts {
@@ -196,5 +243,8 @@ Item {
root.store.clusterStore.clusterPosition = root.store.clusterStore.clusterPosition + 1;
}
}
+ onCtrlVPressed: {
+ root.store.triggerVoiceAssitant();
+ }
}
}
diff --git a/sysui/centerconsole/ApplicationPopup.qml b/sysui/centerconsole/ApplicationPopup.qml
index 1d5c821a..45c082f4 100644
--- a/sysui/centerconsole/ApplicationPopup.qml
+++ b/sysui/centerconsole/ApplicationPopup.qml
@@ -56,10 +56,33 @@ PopupItem {
objectFollowsItemSize: false
}
+ Connections {
+ target: root
+ // reset popup parameters on scale change
+ function onHeightChanged() {
+ if ("open" === root.state) {
+ root.originItemX = root.window.windowProperty("originItemX")
+ root.originItemY = root.window.windowProperty("originItemY")
+ root.y = window.windowProperty("popupY")
+ }
+ }
+ }
+
Component.onCompleted: {
- root.originItemX = root.window.windowProperty("originItemX");
- root.originItemY = root.window.windowProperty("originItemY");
- root.popupY = root.window.windowProperty("popupY");
- root.open();
+ var nativePopup = !!window.popup
+ if (nativePopup) {
+ var pos = window.requestedPopupPosition
+ root.originItemX = pos.x
+ root.originItemY = pos.y
+ root.popupX = pos.x
+ root.popupY = pos.y
+ } else {
+ root.originItemX = root.window.windowProperty("originItemX")
+ root.originItemY = root.window.windowProperty("originItemY")
+ root.popupY = root.window.windowProperty("popupY")
+ }
+ closeToolButton.visible = !nativePopup
+ popupBg.visible = !nativePopup
+ root.open()
}
}
diff --git a/sysui/centerconsole/ApplicationPopups.qml b/sysui/centerconsole/ApplicationPopups.qml
index ea219edf..5df2a2d4 100644
--- a/sysui/centerconsole/ApplicationPopups.qml
+++ b/sysui/centerconsole/ApplicationPopups.qml
@@ -60,7 +60,7 @@ Item {
Connections {
target: model.window
- onContentStateChanged: {
+ function onContentStateChanged() {
if (model.window.contentState === WindowObject.NoSurface) {
// client has closed his PopupWindow. Animate accordingly.
appPopup.close();
diff --git a/sysui/centerconsole/CenterConsole.qml b/sysui/centerconsole/CenterConsole.qml
index 7273e4b7..26cdb915 100644
--- a/sysui/centerconsole/CenterConsole.qml
+++ b/sysui/centerconsole/CenterConsole.qml
@@ -31,6 +31,7 @@
****************************************************************************/
import QtQuick 2.7
+import QtQml 2.14
import QtGraphicalEffects 1.0
import QtQuick.Controls 2.2
import QtGraphicalEffects 1.0
@@ -61,19 +62,8 @@ AbstractCenterConsole {
anchors.leftMargin: Sizes.dp(27)
icon.name: root.store.volumeStore.volumeIcon
onClicked: volumePopup.open()
- enabled: !mainContentArea.item.launcherOpen
+ enabled: mainContentArea.item && !mainContentArea.item.launcherOpen
opacity: enabled ? 1.0 : 0.6
-
- // content item of ToolButton is not scaled correctly in some screen resolutions
- // need to revert this changes once: QTBUG-72569 is fixed.
- contentItem: null
- NeptuneIconLabel {
- anchors.centerIn: parent
- width: Sizes.dp(50)
- height: Sizes.dp(50)
- icon: leftIcon.icon
- color: leftIcon.icon.color
- }
}
ToolButton {
@@ -85,19 +75,8 @@ AbstractCenterConsole {
anchors.rightMargin: Sizes.dp(27)
icon.name: "qt-badge"
onClicked: about.open()
- enabled: !mainContentArea.item.launcherOpen
+ enabled: mainContentArea.item && !mainContentArea.item.launcherOpen
opacity: enabled ? 1.0 : 0.6
-
- // content item of ToolButton is not scaled correctly in some screen resolutions
- // need to revert this changes once: QTBUG-72569 is fixed.
- contentItem: null
- NeptuneIconLabel {
- anchors.centerIn: parent
- width: Sizes.dp(50)
- height: Sizes.dp(50)
- icon: rightIcon.icon
- color: rightIcon.icon.color
- }
}
PopupItemLoader {
@@ -106,7 +85,10 @@ AbstractCenterConsole {
popupParent: root.popupParent
popupX: originItem.mapToItem(parent, 0, 0).x + (LayoutMirroring.enabled ? -width + leftIcon.width: 0)
originItem: leftIcon
- Binding { target: volumePopup.item; property: "model"; value: root.store.volumeStore }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: volumePopup.item; property: "model"; value: root.store.volumeStore;
+ }
onClosed: { leftIcon.forceActiveFocus(); }
}
diff --git a/sysui/centerconsole/CenterConsoleWindow.qml b/sysui/centerconsole/CenterConsoleWindow.qml
index 68f07193..b2d42505 100644
--- a/sysui/centerconsole/CenterConsoleWindow.qml
+++ b/sysui/centerconsole/CenterConsoleWindow.qml
@@ -31,6 +31,7 @@
****************************************************************************/
import QtQuick 2.7
+import QtQml 2.14
import shared.utils 1.0
import stores 1.0
import QtQuick.Window 2.3
@@ -44,8 +45,16 @@ Window {
property alias mainCenterConsole: mainCenterConsole
property RootStore store
- Binding {target: root.store.centerConsole; property: "windowWidth"; value: root.width }
- Binding {target: root.store.centerConsole; property: "windowHeight"; value: root.height }
+ signal nextICAppIsRequested()
+
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: root.store.centerConsole; property: "windowWidth"; value: root.width;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: root.store.centerConsole; property: "windowHeight"; value: root.height;
+ }
title: store.centerConsole.title
color: "black"
@@ -73,24 +82,31 @@ Window {
Connections {
id: windowConns
target: root
- onFrameSwapped: {
+ readonly property string widgetStates: root.store.settingsStore.value("widgetStates"
+ , root.store.settingsStore.defaultWidgetStates)
+ readonly property string autostartApps: root.store.settingsStore.value("autostartApps"
+ , root.store.settingsStore.defaultAutostartApps)
+ readonly property string autorecoverApps: root.store.settingsStore.value("autorecoverApps"
+ , root.store.settingsStore.defaultAutorecoverApps)
+ function onFrameSwapped() {
/*
- The UI is loaded in two steps
- This is done in order to ensure that something is rendered on the screen as
- soon as possible during start up.
-
- Only the lightest elements are present upon creation of this component.
- They are the ones that will be present on the very first rendered frame.
-
- Others, which are more complex and thus take more time to load, will be
- loaded afterwards, once this function is called.
- */
- root.store.applicationModel.populate(root.store.settingsStore.value("widgetStates", root.store.settingsStore.defaultWidgetStates),
- root.store.settingsStore.value("autostartApps", root.store.settingsStore.defaultAutostartApps),
- root.store.settingsStore.value("autorecoverApps", root.store.settingsStore.defaultAutorecoverApps));
- centerConsole.mainContentArea.active = true;
- notificationLoader.active = true;
- windowConns.enabled = false;
+ The UI is loaded in two steps
+ This is done in order to ensure that something is rendered on the screen as
+ soon as possible during start up.
+
+ Only the lightest elements are present upon creation of this component.
+ They are the ones that will be present on the very first rendered frame.
+
+ Others, which are more complex and thus take more time to load, will be
+ loaded afterwards, once this function is called.
+ */
+ if (root.store.applicationModel.count > 0) {
+ root.store.applicationModel.populate(
+ widgetStates, autostartApps, autorecoverApps);
+ centerConsole.mainContentArea.active = true;
+ notificationLoader.active = true;
+ windowConns.enabled = false;
+ }
}
}
@@ -114,7 +130,11 @@ Window {
Loader {
sourceComponent: Component {
- GamePadController {}
+ GamePadController {
+ onButtonBPressed: root.nextICAppIsRequested();
+ onButtonR1Pressed: root.store.musicStore.sendIntent("next");
+ onButtonL1Pressed: root.store.musicStore.sendIntent("prev");
+ }
}
active: root.store.enableCursorManagement
}
@@ -143,8 +163,11 @@ Window {
anchors.fill: centerConsole
source: "../notification/NotificationContent.qml"
- Binding { target: notificationLoader.item; property: "target";
- value: popupParent.showModalOverlay ? popupParent : centerConsole }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: notificationLoader.item; property: "target";
+ value: popupParent.showModalOverlay ? popupParent : centerConsole;
+ }
}
CenterConsoleMonitorOverlay {
diff --git a/sysui/centerconsole/GamePadController.qml b/sysui/centerconsole/GamePadController.qml
index bfb1e084..9be31f9c 100644
--- a/sysui/centerconsole/GamePadController.qml
+++ b/sysui/centerconsole/GamePadController.qml
@@ -33,14 +33,49 @@ import QtQuick 2.2
import QtGamepad 1.0
Item {
+ id: root
+
+ signal buttonAPressed()
+ signal buttonBPressed()
+ signal buttonXPressed()
+ signal buttonR1Pressed()
+ signal buttonL1Pressed()
+
Gamepad {
id: gamepad1
- deviceId: GamepadManager.connectedGamepads.length > 0 ? GamepadManager.connectedGamepads[0] : -1
+ deviceId: GamepadManager.connectedGamepads.length > 0 ?
+ GamepadManager.connectedGamepads[0] : -1
+
+ onButtonAChanged: {
+ if (buttonA) {
+ root.buttonAPressed()
+ }
+ }
+ onButtonBChanged: {
+ if (buttonB) {
+ root.buttonBPressed()
+ }
+ }
+ onButtonXChanged: {
+ if (buttonX) {
+ root.buttonXPressed()
+ }
+ }
+ onButtonL1Changed: {
+ if (buttonL1) {
+ root.buttonL1Pressed()
+ }
+ }
+ onButtonR1Changed: {
+ if (buttonR1) {
+ root.buttonR1Pressed()
+ }
+ }
}
Connections {
target: GamepadManager
- onGamepadConnected: {
+ function onGamepadConnected(deviceId) {
gamepad1.deviceId = deviceId
}
}
diff --git a/sysui/centerconsole/MainContentArea.qml b/sysui/centerconsole/MainContentArea.qml
index 19cbfdcc..b664243c 100644
--- a/sysui/centerconsole/MainContentArea.qml
+++ b/sysui/centerconsole/MainContentArea.qml
@@ -56,7 +56,7 @@ Item {
var margin = root.homeBottomMargin;
if (widgetDrawer.open && widgetDrawer.visible)
margin = Math.max(margin, activeApplicationSlot.height - widgetDrawer.y);
- if (root.virtualKeyboard.isOpen)
+ if (root.virtualKeyboard && root.virtualKeyboard.isOpen)
margin = Math.max(margin, root.virtualKeyboard.y);
return margin;
}
@@ -90,7 +90,7 @@ Item {
// widgets will reparent themselves to the active application slot when active
activeApplicationParent: activeApplicationSlot
moveBottomWidgetToDrawer: !widgetDrawer.showingHomePage
- widgetDrawer: widgetDrawerSlot
+ widgetDrawer: widgetDrawer.slot
popupParent: root.popupParent
exposedRectTopMargin: launcher.y + Sizes.dp(Config.launcherHeight)
exposedRectBottomMargin: root.activeAppBottomMargin
@@ -123,16 +123,9 @@ Item {
height: homePage.rowHeight
anchors.bottom: homePage.bottom
- dragEnabled: !showingHomePage
- visible: !showingHomePage && !widgetDrawerSlot.empty
-
- Item {
- id: widgetDrawerSlot
- width: homePage.widgetWidth
- height: homePage.rowHeight
- anchors.horizontalCenter: widgetDrawer.horizontalCenter
- readonly property bool empty: children.length === 0
- }
+ slotWidth: homePage.widgetWidth
+ slotHeight: homePage.rowHeight
+ visible: !showingHomePage && !widgetDrawer.empty
property bool showingHomePage: !root.applicationModel || root.applicationModel.activeAppInfo === null
onShowingHomePageChanged: {
diff --git a/sysui/centerconsole/UIShortcuts.qml b/sysui/centerconsole/UIShortcuts.qml
index e228e972..d2d2eb9f 100644
--- a/sysui/centerconsole/UIShortcuts.qml
+++ b/sysui/centerconsole/UIShortcuts.qml
@@ -48,6 +48,7 @@ Item {
signal ctrlPPressed()
signal ctrlXPressed()
signal ctrlShiftCPressed()
+ signal ctrlVPressed()
Shortcut {
sequence: "Ctrl+r"
@@ -95,4 +96,9 @@ Item {
context: Qt.ApplicationShortcut
onActivated: root.ctrlShiftCPressed()
}
+ Shortcut {
+ sequence: "Ctrl+v"
+ context: Qt.ApplicationShortcut
+ onActivated: root.ctrlVPressed()
+ }
}
diff --git a/sysui/centerconsole/VirtualKeyboard.qml b/sysui/centerconsole/VirtualKeyboard.qml
index 96836015..a201317d 100644
--- a/sysui/centerconsole/VirtualKeyboard.qml
+++ b/sysui/centerconsole/VirtualKeyboard.qml
@@ -40,24 +40,31 @@ Item {
id: root
readonly property bool isOpen: inputPanel.state === "active"
-
+ property real parentRotation: 0
height: inputPanel.height
InputPanel {
id: inputPanel
- anchors.left: parent.left
- anchors.right: parent.right
+ width: root.width
+ rotation: parentRotation
+ transformOrigin: Item.TopLeft
states: [
State {
name: "active"
when: inputPanel.active
- PropertyChanges { target: inputPanel; y: 0; visible: true }
+ PropertyChanges {
+ target: inputPanel; y: root.mapToItem(null, 0, 0).y;
+ visible: true; x: root.mapToItem(null, 0, 0).x
+ }
},
State {
name: "hidden"
when: !inputPanel.active
- PropertyChanges { target: inputPanel; y: height; visible: false }
+ PropertyChanges {
+ target: inputPanel; y: root.mapToItem(null, 0, 0).y + height;
+ visible: false; x: root.mapToItem(null, 0, 0).x
+ }
}
]
@@ -73,6 +80,5 @@ Item {
DefaultNumberAnimation { target: inputPanel; property: "y" }
}
]
-
}
}
diff --git a/sysui/centerconsole/WidgetDrawer.qml b/sysui/centerconsole/WidgetDrawer.qml
index cbbf65fe..41b5f385 100644
--- a/sysui/centerconsole/WidgetDrawer.qml
+++ b/sysui/centerconsole/WidgetDrawer.qml
@@ -49,31 +49,47 @@ import shared.Sizes 1.0
SomeItem {}
}
*/
-MouseArea {
+Item {
id: root
- drag.target: root
- drag.axis: Drag.XAxis
- drag.filterChildren: dragEnabled
- drag.minimumX: 0
- drag.maximumX: root.width - stickOutWidth
-
- opacity: 0.5 + 0.5*(1 - (root.x - drag.minimumX)/(drag.maximumX - drag.minimumX))
-
- // Whether the drag behavior is enabled.
- property bool dragEnabled: true
// how much of it should be sticking out from the right side of the display when
// the widget drawer has been closed
readonly property real stickOutWidth: Sizes.dp(90)
+ property Item slot: widgetDrawerSlot
+ property alias slotWidth: widgetDrawerSlot.width
+ property alias slotHeight: widgetDrawerSlot.height
+ property alias empty: widgetDrawerSlot.empty
+
// true if in full view, false if it's tucked away on the right side of the display
property bool open: true
onOpenChanged: d.applyOpenState()
+ opacity: 0.5 + 0.5 * (1 - Math.abs(root.x) / d.widthWithoutStick)
+
+ Item {
+ id: widgetDrawerSlot
+ anchors.horizontalCenter: root.horizontalCenter
+ readonly property bool empty: children.length === 0
+ }
+
+ MouseArea {
+ id: handl
+ width: root.stickOutWidth
+ height: root.height
+ anchors.left: root.left
+
+ drag.target: root
+ drag.axis: Drag.XAxis
+
+ drag.minimumX: d.layoutMirroringEnabled ? - d.widthWithoutStick : 0
+ drag.maximumX: d.layoutMirroringEnabled ? 0 : d.widthWithoutStick
+ }
+
Connections {
- target: drag
- onActiveChanged: {
- if (root.drag.active) {
+ target: handl.drag
+ function onActiveChanged() {
+ if (handl.drag.active) {
d.lastX = root.x;
d.direction = 0;
d.dragging = true;
@@ -102,12 +118,19 @@ MouseArea {
property int direction
property bool dragging: false
readonly property real minimumDrag: Sizes.dp(90)
+ readonly property real widthWithoutStick: root.width - root.stickOutWidth
+ readonly property bool layoutMirroringEnabled: root.LayoutMirroring.enabled
+
+ onLayoutMirroringEnabledChanged: {
+ d.dragging = true
+ d.applyOpenState()
+ }
function applyOpenState() {
if (root.open) {
- root.x = root.drag.minimumX;
+ root.x = 0;
} else {
- root.x = root.drag.maximumX;
+ root.x = d.layoutMirroringEnabled ? - d.widthWithoutStick : d.widthWithoutStick;
}
}
}
@@ -115,7 +138,8 @@ MouseArea {
if (!d.dragging) {
return;
}
- if (x > d.lastX) {
+ let isDirectionForOpening = d.layoutMirroringEnabled ? (x < d.lastX) : (x > d.lastX)
+ if (isDirectionForOpening) {
if (d.direction !== 1) {
d.direction = 1;
d.startX = x;
diff --git a/sysui/home/+lucee/ApplicationWidget.qml b/sysui/home/+lucee/ApplicationWidget.qml
index d6ec3ef6..3705168e 100644
--- a/sysui/home/+lucee/ApplicationWidget.qml
+++ b/sysui/home/+lucee/ApplicationWidget.qml
@@ -83,8 +83,10 @@ AbstractApplicationWidget {
// Application icon
NeptuneIconLabel {
- width: Sizes.dp(35)
- height: Sizes.dp(35)
+ display: NeptuneIconLabel.IconOnly
+ iconFillMode: Image.PreserveAspectFit
+ iconRectHeight: Sizes.dp(35)
+ iconRectWidth: iconRectHeight
anchors.centerIn: widgetStripe
icon.source: root.appInfo ? root.appInfo.icon : null
icon.color: "white"
diff --git a/sysui/home/AddWidgetPopupLoader.qml b/sysui/home/AddWidgetPopupLoader.qml
index df3c71dc..7aac2f23 100644
--- a/sysui/home/AddWidgetPopupLoader.qml
+++ b/sysui/home/AddWidgetPopupLoader.qml
@@ -31,6 +31,7 @@
****************************************************************************/
import QtQuick 2.10
+import QtQml 2.14
/*
A seamless wrapper for AddWidgetPopup that loads it on demand
@@ -56,7 +57,7 @@ Loader {
Connections {
target: item
- onClosed: {
+ function onClosed() {
root.closed();
}
}
@@ -86,7 +87,16 @@ Loader {
}
}
- Binding { target: root.item; property: "parent"; value: root.popupParent }
- Binding { target: root.item; property: "originItem"; value: root.originItem }
- Binding { target: root.item; property: "model"; value: root.model }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: root.item; property: "parent"; value: root.popupParent;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: root.item; property: "originItem"; value: root.originItem;
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: root.item; property: "model"; value: root.model;
+ }
}
diff --git a/sysui/home/ApplicationWidget.qml b/sysui/home/ApplicationWidget.qml
index 90fbeb43..7d70ce7f 100644
--- a/sysui/home/ApplicationWidget.qml
+++ b/sysui/home/ApplicationWidget.qml
@@ -72,11 +72,13 @@ AbstractApplicationWidget {
// Application icon
NeptuneIconLabel {
- width: Sizes.dp(25)
- height: Sizes.dp(25)
+ display: NeptuneIconLabel.IconOnly
+ iconFillMode: Image.PreserveAspectFit
+ iconRectHeight: Sizes.dp(25)
+ iconRectWidth: iconRectHeight
anchors.horizontalCenter: widgetStripe.horizontalCenter
anchors.top: widgetStripe.top
- anchors.topMargin: widgetStripe.border.top * 0.8
+ anchors.topMargin: iconRectHeight * 0.8
icon.source: root.appInfo ? root.appInfo.icon : null
icon.color: "white"
opacity: root.active ? 0 : 1
@@ -107,24 +109,24 @@ AbstractApplicationWidget {
ToolButton {
anchors.horizontalCenter: widgetStripe.horizontalCenter
anchors.bottom: parent.bottom
+ anchors.bottomMargin: implicitWidth
objectName: "appWidgetClose_" + (root.appInfo ?
(root.appInfo.id ? root.appInfo.id : "none")
: "nothing"
)
- implicitWidth: widgetStripe.width + Sizes.dp(18)
- implicitHeight: width
+ implicitWidth: Sizes.dp(25)
+ implicitHeight: implicitWidth
visible: root.buttonsVisible
onClicked: root.closeClicked()
-
- contentItem: NeptuneIconLabel {
- anchors.centerIn: parent
- width: Sizes.dp(25)
- height: Sizes.dp(25)
- icon.color: "white"
- icon.source: Style.image("ic-widget-close")
- }
+ iconFillMode: Image.PreserveAspectFit
+ display: NeptuneIconLabel.IconOnly
+ iconRectHeight: implicitWidth
+ iconRectWidth: implicitWidth
+ icon.color: "white"
+ icon.source: Style.image("ic-widget-close")
+ padding: 0
}
// Maximize button
diff --git a/sysui/home/WidgetGrid.qml b/sysui/home/WidgetGrid.qml
index cccdfce9..00757f01 100644
--- a/sysui/home/WidgetGrid.qml
+++ b/sysui/home/WidgetGrid.qml
@@ -467,20 +467,9 @@ Item {
appInfo.asWidget = false;
}
- onActiveChanged: {
- if (active) {
- //keep widget state of item on index when maximized
- widgetStateWhenMaximized = widgetState;
- clickedIndexWhenMaximized = index;
- }
- }
-
widgetState: {
if (!appInfo || !appInfo.asWidget) {
return "";
- } else if ((widgetStateWhenMaximized !== "") && (clickedIndexWhenMaximized > -1)
- && (clickedIndexWhenMaximized === index)) {
- return widgetStateWhenMaximized;
} else {
switch (Math.round(height / (root.rowHeight - root.resizerHandleHeight))) {
case 0:
@@ -515,6 +504,7 @@ Item {
return "home"
}
}
+
states: [
State {
name: "home"
@@ -619,8 +609,6 @@ Item {
// to figure out which handle is being dragged without having to know about the
// size of their touch areas.
onPressed: {
- widgetStateWhenMaximized = "";
- clickedIndexWhenMaximized = -1;
pressedYDelta = mouseY - (height / 2);
widgetColumn.onResizeHandlePressed(mapToItem(root, mouseX, height / 2))
}
diff --git a/sysui/instrumentcluster/ApplicationICWindows.qml b/sysui/instrumentcluster/ApplicationICWindows.qml
index 8ad7ef21..ca1bcb47 100644
--- a/sysui/instrumentcluster/ApplicationICWindows.qml
+++ b/sysui/instrumentcluster/ApplicationICWindows.qml
@@ -42,7 +42,9 @@ Item {
property var applicationModel
function next() {
- if ( selectedIndex + 1 < applicationICWindowList.count) {
+ // go to the next app. If last, set index out of list to make
+ // selectedApplicationId change to "" -> show "no app" in cluster
+ if ( selectedIndex + 1 <= applicationICWindowList.count) {
selectedIndex++;
} else {
selectedIndex = 0;
@@ -60,7 +62,7 @@ Item {
delegate: QtObject {
property var con: Connections {
target: model.appInfo
- onIcWindowChanged: {
+ function onIcWindowChanged() {
if (model.appInfo.icWindow) {
var appInList = false;
for (var i = 0; i < applicationICWindowList.count; i++) {
diff --git a/sysui/instrumentcluster/InstrumentClusterWindow.qml b/sysui/instrumentcluster/InstrumentClusterWindow.qml
index 9af5ffa8..8a883117 100644
--- a/sysui/instrumentcluster/InstrumentClusterWindow.qml
+++ b/sysui/instrumentcluster/InstrumentClusterWindow.qml
@@ -31,6 +31,7 @@
****************************************************************************/
import QtQuick 2.7
+import QtQml 2.14
import shared.utils 1.0
import QtQuick.Window 2.3
import system.controls 1.0
@@ -52,33 +53,30 @@ Window {
applicationICWindows.next();
}
- //Demo case to stick QtSafeRendererWindow to Cluster on Desktop
- //should be also enabled on "Safe" part
- function sendWindowCoordsToSafeUI(x, y) {
- var sendMessageObject = Qt.createQmlObject("import QtQuick 2.0; import Qt.SafeRenderer 1.1;
- QtObject {
- function sendClusterWindowPos(x,y) {
- SafeMessage.moveItem(\"mainWindow\", Qt.point(x, y))
- }
- }
- ", root, "sendMessageObject")
- sendMessageObject.sendClusterWindowPos(x, y);
+ // Demo case to stick QtSafeRendererWindow to Cluster on Desktop
+ // should be also enabled on "Safe" part
+ // send x,y of window, x,y of uiSlot (contains cluster view item) inside window,
+ // width and height of uiSlot item
+ function sendWindowStateToSafeUI() {
+ if (root.clusterStore.runningOnDesktop) {
+ var sendMessageObject = Qt.createQmlObject(
+ "import QtQuick 2.0; import Qt.SafeRenderer 1.1;
+ QtObject {
+ function sendClusterWindowState(x,y, dx, dy, width, height) {
+ SafeMessage.moveItem(\"mainWindowPos\", Qt.point(x, y))
+ SafeMessage.moveItem(\"mainWindowPanelOrigin\", Qt.point(dx, dy))
+ SafeMessage.moveItem(\"mainWindowPanelSize\", Qt.point(width, height))
+ }
+ }", root, "sendMessageObject");
+ sendMessageObject.sendClusterWindowState(root.x, root.y, uiSlot.x, uiSlot.y,
+ uiSlot.width, uiSlot.height);
+ }
}
color: "black"
title: root.clusterStore.clusterTitle
screen: root.clusterStore.clusterScreen
- onWidthChanged: {
- root.contentItem.Sizes.scale = root.width / Config.instrumentClusterWidth;
- }
-
- //send (if enabled) cluster window positions to QSR Safe UI, 180 is cluster item top margin
- //QSR Safe UI window then moves to cluster item 0,0 position
- onXChanged: if (root.clusterStore.qsrEnabled) sendWindowCoordsToSafeUI(root.x, root.y + 180);
- onYChanged: if (root.clusterStore.qsrEnabled) sendWindowCoordsToSafeUI(root.x, root.y + 180);
-
-
Component.onCompleted: {
// Would like to use a regular property binding instead. But it doesn't work and I don't know why
visible = true;
@@ -96,6 +94,26 @@ Window {
}
}
+ // Use these two Connections to send (if qsr enabled) cluster window positions to QSR Safe UI
+ // QSR Safe UI window then moves to cluster item 0,0 position
+ // panel properties for scale are sent from SafeTelltalesPanel
+ // Desktop-specific demo case
+ Connections {
+ target: root
+ enabled: root.clusterStore.qsrEnabled
+ function onXChanged() { sendWindowStateToSafeUI(); }
+ function onYChanged() { sendWindowStateToSafeUI(); }
+ function onActiveChanged() { sendWindowStateToSafeUI(); }
+ }
+ Connections {
+ target: uiSlot
+ enabled: root.clusterStore.qsrEnabled
+ function onWidthChanged() { sendWindowStateToSafeUI(); }
+ function onHeightChanged() { sendWindowStateToSafeUI(); }
+ function onYChanged() { sendWindowStateToSafeUI(); }
+ function onXChanged() { sendWindowStateToSafeUI(); }
+ }
+
Item {
id: uiSlot
@@ -132,9 +150,16 @@ Window {
}
]
- width: parent.width
- height: width / Config.instrumentClusterUIAspectRatio
+ anchors.horizontalCenter: parent.horizontalCenter
rotation: root.invertedOrientation ? 180 : 0
+ height: Math.floor(root.width / Config.instrumentClusterUIAspectRatio) <= root.height
+ ? root.width / Config.instrumentClusterUIAspectRatio
+ : root.height;
+ width: height * Config.instrumentClusterUIAspectRatio
+
+ onWidthChanged: {
+ root.contentItem.Sizes.scale = uiSlot.width / Config.instrumentClusterWidth;
+ }
Image {
anchors.fill: parent
@@ -148,7 +173,7 @@ Window {
anchors.fill: parent
applicationModel: root.applicationModel
- visible: !empty
+ visible: !empty && (selectedApplicationId !== "")
readonly property bool selectedNavigation: {
if (root.applicationModel) {
@@ -159,7 +184,34 @@ Window {
}
return false;
}
- Binding { target: uiSettings; property: "navigationMode"; value: applicationICWindows.selectedNavigation }
+
+ onSelectedApplicationIdChanged: {
+ /*
+ change UI mode of cluster according to app behind gauges
+ */
+ var clusterUIMode = 0; //no app running default
+
+ if (selectedApplicationId !== "") {
+ var app = root.applicationModel.applicationFromId(selectedApplicationId)
+ if (app) {
+ if (app.categories.indexOf("navigation") !== -1) {
+ clusterUIMode = 2; //navi app
+ } else {
+ clusterUIMode = 1; //some app
+ }
+ }
+ }
+
+ if ( root.applicationModel.instrumentClusterAppInfo &&
+ root.applicationModel.instrumentClusterAppInfo.window ) {
+ root.applicationModel.instrumentClusterAppInfo.window.setWindowProperty("clusterUIMode", clusterUIMode)
+ }
+ }
+ Binding {
+ restoreMode: Binding.RestoreBinding;
+ target: uiSettings; property: "navigationMode";
+ value: applicationICWindows.selectedNavigation;
+ }
}
ApplicationICWindowItem {
diff --git a/sysui/launcher/+lucee/AppIcon.qml b/sysui/launcher/+lucee/AppIcon.qml
index 4f3aedd6..c3225faf 100644
--- a/sysui/launcher/+lucee/AppIcon.qml
+++ b/sysui/launcher/+lucee/AppIcon.qml
@@ -37,6 +37,9 @@ import shared.Style 1.0
NeptuneIconLabel {
property bool checked: false
property string source
+ iconFillMode: Image.PreserveAspectFit
+ iconRectHeight: height
+ iconRectWidth: width
icon.color: checked ? Style.accentColor : "white"
icon.source: source
}
diff --git a/sysui/launcher/EditableGridView.qml b/sysui/launcher/EditableGridView.qml
index ae0fafd2..caa3e444 100644
--- a/sysui/launcher/EditableGridView.qml
+++ b/sysui/launcher/EditableGridView.qml
@@ -47,7 +47,7 @@ Item {
property var model
property var exclusiveButtonGroup
readonly property int numIconsPerRow: 4
- property alias gridEditMode: grid.editMode
+ property bool editMode: false
readonly property alias cellWidth: grid.cellWidth
readonly property alias cellHeight: grid.cellHeight
@@ -57,7 +57,7 @@ Item {
onGridOpenChanged: {
if (!root.gridOpen) {
- grid.editMode = false;
+ root.editMode = false;
}
}
@@ -82,37 +82,39 @@ Item {
}
function refreshItems() {
- for (var i = 0; i < root.model.count; i++) {
- var item = root.model.get(i);
- var groups = ["items"]
- //not a system app
- if (!item.appInfo.isSystemApp) {
- groups = ["items", "noSystem"]
- }
- //not system and not dev
- if (!item.appInfo.isSystemApp && (item.appInfo.categories.indexOf("dev") < 0)) {
- groups = ["items", "noSystemNoDev", "noSystem"]
+ for (var i = 0; i < root.model.count; ++i) {
+ var appInfo = root.model.get(i).appInfo;
+
+ var systemApp = appInfo.isSystemApp;
+ var devApp = appInfo.categories.indexOf("dev") >= 0;
+ var hideForced = "showInLauncher" in appInfo.application.applicationProperties
+ ? !appInfo.application.applicationProperties["showInLauncher"]
+ : false;
+
+ visualModel.items.removeGroups(i, 1, ["show"]);
+ if (!hideForced) {
+ if (systemApp && showSystemApps && devApp && showDevApps
+ || systemApp && showSystemApps && !devApp
+ || devApp && showDevApps && !systemApp
+ || !devApp && !systemApp)
+ {
+ visualModel.items.addGroups(i, 1, ["show"]);
+ }
}
- visualModel.items.setGroups(i, 1, groups)
}
- if (!showSystemApps)
- visualModel.filterOnGroup = "noSystem"
-
- if (!showDevApps)
- visualModel.filterOnGroup = "noSystemNoDev"
+ visualModel.filterOnGroup = "show";
}
groups: [
- DelegateModelGroup { name: "noSystem"; includeByDefault: false },
- DelegateModelGroup { name: "noSystemNoDev"; includeByDefault: false }
+ DelegateModelGroup { name: "show"; includeByDefault: false }
]
delegate: Item {
id: delegateRoot
objectName: "gridDelegate_" + (model.appInfo ? model.appInfo.id : "none")
- property int modelIndex: model.index
+ property int visualIndex: DelegateModel.itemsIndex
width: grid.cellWidth
height: grid.cellHeight
@@ -120,39 +122,31 @@ Item {
//disable mouse interaction for invisible items when only top row is shown
enabled: opacity > 0.0
opacity: {
- //get item index in source model or in filtered if filter applied
- var index = model.index;
-
- if (visualModel.filterOnGroup !== ""
- && index < visualModel.items.count
- && index > -1) {
- var item = visualModel.items.get(index);
- if (item)
- index = item[visualModel.filterOnGroup + "Index"];
- }
+ if (!root.gridOpen && DelegateModel.showIndex >= root.numIconsPerRow)
+ return 0.0
- if (index > (root.numIconsPerRow - 1)) {
- if (root.gridOpen) {
- return 1.0
- } else {
- return 0.0
- }
- }
return 1.0
}
Behavior on opacity { DefaultNumberAnimation { } }
DragHandler {
id: handler
- enabled: root.gridEditMode
+ target: appButton
+ enabled: root.editMode
+ xAxis.minimum: 0
+ xAxis.maximum: grid.width - grid.cellWidth
+ xAxis.enabled: true
+
+ yAxis.minimum: 0
+ yAxis.maximum: grid.height - grid.cellHeight
+ yAxis.enabled: true
+
onActiveChanged: {
if (!active) {
//when it's dragged, it stops being the item that
//currently has the cursor and so the item's release
//signal is not emitted. 'Release' here instead.
- appButton.scale = 1.0;
- handler.target = null;
- appButton.dragIndex = -1;
+ appButton.released();
}
}
}
@@ -166,11 +160,11 @@ Item {
anchors.verticalCenter: parent.verticalCenter
anchors.verticalCenterOffset: -Sizes.dp(10)
- property int dragIndex: -1
+ property int dragIndex: delegateRoot.visualIndex
Connections {
target: model.appInfo
- onActiveChanged: {
+ function onActiveChanged() {
if (model.appInfo.active) {
appButton.checked = true;
} else {
@@ -179,7 +173,7 @@ Item {
}
}
- editModeBgOpacity: handler.active ? 0.8 : grid.editMode ? 0.2 : 0.0
+ editModeBgOpacity: handler.active ? 0.8 : root.editMode ? 0.2 : 0.0
editModeBgColor: handler.active ? "#404142" : "#F1EFED"
icon.name: model.appInfo ? model.appInfo.icon : ""
text: model.appInfo ? model.appInfo.name : null
@@ -207,36 +201,31 @@ Item {
]
onClicked: {
- if (!grid.editMode) {
+ if (!root.editMode) {
root.appButtonClicked(model.applicationId);
model.appInfo.start();
}
}
- onPressed: {
- if (grid.editMode) {
- handler.target = appButton;
- dragIndex = model.index;
- }
- }
-
onPressAndHold: {
- if (root.gridOpen) {
- grid.editMode = true;
- handler.target = appButton;
- dragIndex = model.index;
+ // pressed and held -> start user arrange
+ // don't update if it's already in editMode
+ if (root.gridOpen && !root.editMode) {
+ root.editMode = true;
}
}
}
DropArea {
- anchors { fill: parent; }
+ anchors { centerIn: parent; }
+ width: parent.width * 0.9
+ height: parent.height * 0.9
onEntered: {
- root.model.move(appButton.modelIndex, appButton.dragIndex, 1);
+ grid.model.items.move(drag.source.target.dragIndex, delegateRoot.visualIndex);
}
}
- state: grid.editMode ? "editing" : "normal"
+ state: root.editMode ? "editing" : "normal"
states: [
State {
name: "normal"
@@ -263,7 +252,6 @@ Item {
GridView {
id: grid
- property bool editMode: false
LayoutMirroring.enabled: false
Layout.alignment: Qt.AlignTop
anchors.fill: parent
@@ -283,11 +271,11 @@ Item {
anchors.horizontalCenter: parent.horizontalCenter
width: root.width/2
height: Sizes.dp(80)
- opacity: grid.editMode ? 1.0 : 0.0
+ opacity: root.editMode ? 1.0 : 0.0
Behavior on opacity { DefaultNumberAnimation { } }
visible: opacity > 0
text: qsTr("Finish Editing")
- onClicked: grid.editMode = false
+ onClicked: root.editMode = false
}
}
diff --git a/sysui/launcher/Launcher.qml b/sysui/launcher/Launcher.qml
index 635a559e..8bddacce 100644
--- a/sysui/launcher/Launcher.qml
+++ b/sysui/launcher/Launcher.qml
@@ -46,7 +46,7 @@ Item {
id: root
readonly property real expandedHeight: Sizes.dp(800)
- readonly property bool open: gridButton.checked
+ readonly property bool open: gridButton.gridOpen
property bool showDevApps: false
property bool showSystemApps: false
property var applicationModel
@@ -59,7 +59,7 @@ Item {
id: backgroundArea
width: root.parentWidth
height: root.parentHeight
- onClicked: gridButton.checked = false;
+ onClicked: gridButton.gridOpen = false;
enabled: root.open
}
@@ -67,7 +67,7 @@ Item {
id: buttonGroup
}
- HomeButton {
+ ToolButton {
id: homeButton
anchors.top: parent.top
@@ -75,8 +75,9 @@ Item {
anchors.leftMargin: Sizes.dp(134) - width/2
width: Sizes.dp(90)
height: Sizes.dp(90)
-
+ icon.color: Style.contrastColor
icon.name: "ic-menu-home"
+ display: NeptuneIconLabel.IconOnly
ButtonGroup.group: buttonGroup
checkable: true
checked: !_isThereActiveApp
@@ -99,8 +100,9 @@ Item {
objectName: "gridButton"
width: Sizes.dp(90)
height: Sizes.dp(90)
-
- readonly property bool useCloseIcon: editableLauncher.gridEditMode || root.open
+ //holds the state of apps grid (opened/closed)
+ property bool gridOpen: false
+ readonly property bool useCloseIcon: editableLauncher.editMode || root.open
anchors.top: parent.top
anchors.right: parent.right
@@ -110,17 +112,7 @@ Item {
icon.name: useCloseIcon ? "ic-close" : "ic-menu-allapps"
icon.color: "white"
checkable: true
-
- // content item of ToolButton is not scaled correctly in some screen resolutions
- // need to revert this changes once: QTBUG-72569 is fixed.
- contentItem: null
- NeptuneIconLabel {
- anchors.centerIn: parent
- width: Sizes.dp(35)
- height: Sizes.dp(35)
- icon: gridButton.icon
- color: gridButton.icon.color
- }
+ onClicked: gridButton.gridOpen = !gridButton.gridOpen
}
EditableGridView {
@@ -135,7 +127,7 @@ Item {
showSystemApps: root.showSystemApps
exclusiveButtonGroup: buttonGroup
onAppButtonClicked: {
- gridButton.checked = false;
+ gridButton.gridOpen = false;
}
}
state: _isThereActiveApp ? (root.open ? "open_active_app" : "closed_active_app") : (root.open ? "open_no_app" : "closed_no_app")
diff --git a/sysui/notification/NotificationCenter.qml b/sysui/notification/NotificationCenter.qml
index f4a0ae1e..a62c4151 100644
--- a/sysui/notification/NotificationCenter.qml
+++ b/sysui/notification/NotificationCenter.qml
@@ -41,31 +41,49 @@ import shared.Style 1.0
Item {
id: root
+
+ state: "closed"
states: [
State {
- when: root.incomingNoti
+ name: "closed"
PropertyChanges {
target: root
- height: (Sizes.dp(150) + notificationToast.height)
- y: 0
+ y: -allNotificationsHeight
+ height: allNotificationsHeight
}
PropertyChanges {
target: notificationToast
- opacity: 1.0
- visible: true
+ opacity: 0.0
+ visible: false
+ }
+ PropertyChanges {
+ target: notificationCenterBG
+ opacity: 0.0
+ }
+ PropertyChanges {
+ target: notificationLabelOnBG
+ opacity: 0.0
}
PropertyChanges {
target: notificationListItem
opacity: 0.0
visible: false
}
+ PropertyChanges {
+ target: clearListButton
+ opacity: 0.0
+ }
},
State {
- when: root.openNotificationCenter
+ name: "intermediate_from_closed"
+ PropertyChanges {
+ target: notificationCenterBG
+ opacity: 1.0
+ }
PropertyChanges {
target: root
- height: (root.totalContentHeight + notificationDefaultMargin + notificationBottomMargin)
- y: 0
+ y: -allNotificationsHeight
+ height: allNotificationsHeight
}
PropertyChanges {
target: notificationToast
@@ -79,85 +97,137 @@ Item {
}
},
State {
- when: (!root.incomingNoti && !root.openNotificationCenter)
+ name: "incomingNotification"
+ PropertyChanges {
+ target: notificationCenterBG
+ opacity: 1.0
+ }
PropertyChanges {
target: root
- height: (root.totalContentHeight + notificationDefaultMargin + notificationBottomMargin)
- y: -root.height
+ height: oneIncomingNotificationHeight
+ y: 0
}
PropertyChanges {
target: notificationToast
+ opacity: 1.0
+ visible: true
+ }
+ PropertyChanges {
+ target: notificationListItem
opacity: 0.0
visible: false
}
PropertyChanges {
- target: notificationListItem
+ target: clearListButton
+ opacity: 0.0
+ }
+ },
+ State {
+ name: "intermediate_from_all"
+ extend: "allNotifications"
+ },
+ State {
+ name: "allNotifications"
+ PropertyChanges {
+ target: root
+ y: 0
+ height: allNotificationsHeight
+ }
+ PropertyChanges {
+ target: notificationCenterBG
+ opacity: 1.0
+ }
+ PropertyChanges {
+ target: notificationToast
opacity: 0.0
visible: false
}
+ PropertyChanges {
+ target: notificationListItem
+ opacity: 1.0
+ visible: true
+ }
}
]
- transitions: Transition {
- PropertyAnimation { properties: "y, height"; easing.type: Easing.InOutQuad }
- PropertyAnimation { properties: "opacity"; duration: 400 }
- }
+ transitions: [
+ Transition {from: "*"; to: "intermediate_from_closed"}
+ , Transition {from: "*"; to: "intermediate_from_all"}
+ , Transition {
+ PropertyAnimation {
+ properties: "y, height";
+ easing.type: Easing.InOutQuad;
+ }
+ PropertyAnimation { properties: "opacity"; duration: 400 }
+ }
+ ]
- readonly property int totalMaxContentHeight: (parent.height - Config.statusBarHeight - root.notificationDefaultMargin - root.notificationBottomMargin)
- readonly property int totalContentHeight: (notificationList.contentHeight > root.totalMaxContentHeight) ? root.totalMaxContentHeight : notificationList.contentHeight
- readonly property int listviewHeight: Math.min((root.notificationModel.count * Sizes.dp(120)), root.totalContentHeight)
+ readonly property int oneIncomingNotificationHeight: Sizes.dp(100) + notificationToast.height
+ readonly property int allNotificationsHeight: root.totalContentHeight
+ + root.notificationDefaultMargin
+ + root.notificationBottomMargin
+
+ readonly property int totalMaxContentHeight: parent.height
+ - Config.statusBarHeight
+ - root.notificationDefaultMargin
+ - root.notificationBottomMargin
+ readonly property int totalContentHeight:
+ notificationList.contentHeight > root.totalMaxContentHeight
+ ? root.totalMaxContentHeight
+ : notificationList.contentHeight
+ readonly property int listviewHeight:
+ Math.min((root.notificationModel.count * Sizes.dp(120)), root.totalContentHeight)
readonly property int notificationDefaultMargin: Sizes.dp(40)
readonly property int notificationBottomMargin: Sizes.dp(110)
readonly property int defaultTimeout: 2000
property NotificationModel notificationModel
- property bool incomingNoti: false
- property bool openNotificationCenter: false
function closeNotificationCenter() {
// reset helper properties&timer
- root.incomingNoti = false;
- root.openNotificationCenter = false;
notificationShowTimer.stop();
notificationShowTimer.interval = root.defaultTimeout;
+ state = "closed"
}
Rectangle {
- id: notificationCenterBg
+ id: notificationCenterBG
anchors.fill: parent
color: Style.offMainColor
+ visible: opacity > 0.0
+ Behavior on opacity { DefaultNumberAnimation { } }
}
Timer {
id: notificationShowTimer
onTriggered: {
- root.incomingNoti = false;
+ if (root.state == "incomingNotification")
+ root.state = "closed";
}
}
Connections {
target: root.notificationModel
- onCountChanged: {
- if (root.incomingNoti && (root.notificationModel.count === 0)) {
- root.incomingNoti = false;
+ function onCountChanged() {
+ if (root.notificationModel.count === 0) {
+ root.state = "closed";
}
}
- onNotificationAdded: {
- root.incomingNoti = true;
+ function onNotificationAdded() {
+ state = "incomingNotification";
notificationShowTimer.stop();
- var currentNotification = root.notificationModel.model.get(root.notificationModel.count - 1);
- if (currentNotification.timeout > root.defaultTimeout) {
- notificationShowTimer.interval = currentNotification.timeout;
- } else {
- notificationShowTimer.interval = root.defaultTimeout;
- }
+ var notification = root.notificationModel.model.get(root.notificationModel.count - 1);
+ notificationShowTimer.interval = (notification.timeout > root.defaultTimeout)
+ ? notification.timeout
+ : root.defaultTimeout;
+
notificationShowTimer.start();
}
- onNotificationClosed: {
- root.incomingNoti = false;
+ function onNotificationClosed() {
+ root.state = "closed";
}
}
@@ -178,25 +248,36 @@ Item {
interactive: (contentHeight > root.listviewHeight)
model: root.notificationModel.model
ScrollIndicator.vertical: ScrollIndicator { }
+ onCountChanged: {
+ positionViewAtEnd();
+ }
delegate: NotificationItem {
width: notificationList.width
notificationIcon: model.icon
notificationText: model.summary
notificationSubtext: model.body
notificationImage: model.image
- notificationActionText: (model.actions.length > 0) ? model.actions[0].actionText : ""
+ notificationActionText: model.actions.length > 0 ? model.actions[0].actionText : ""
+ Behavior on height { DefaultNumberAnimation { duration: 300 } }
+ Behavior on opacity { DefaultNumberAnimation { duration: 200 } }
+ onHeightChanged: {
+ if (height == 0)
+ root.notificationModel.removeNotification(model.id);
+ }
onCloseClicked: {
- root.notificationModel.removeNotification(model.id);
+ opacity = 0;
+ height = 0;
}
onButtonClicked: {
root.notificationModel.buttonClicked(model.id);
- root.openNotificationCenter = false;
+ root.state = "closed";
}
}
}
}
Label {
+ id: notificationLabelOnBG
anchors.centerIn: parent
visible: opacity > 0.0
opacity: (root.notificationModel.count === 0) ? 1.0 : 0.0
diff --git a/sysui/notification/NotificationContent.qml b/sysui/notification/NotificationContent.qml
index d8f64b24..62100f68 100644
--- a/sysui/notification/NotificationContent.qml
+++ b/sysui/notification/NotificationContent.qml
@@ -39,7 +39,7 @@ import shared.Sizes 1.0
ModalOverlay {
id: root
- showModalOverlay: notificationCenter.openNotificationCenter
+ showModalOverlay: notificationCenter.state === "allNotifications"
onOverlayClicked: {
notificationCenter.closeNotificationCenter();
}
@@ -66,45 +66,25 @@ ModalOverlay {
anchors.horizontalCenter: root.horizontalCenter
anchors.top: notificationCenter.bottom
notificationCount: notificationModel.count
- notificationCounterVisible: ((notificationCount > 0) && !notificationCenter.openNotificationCenter)
+ notificationCounterVisible: notificationCount > 0
+ && notificationCenter.state !== "allNotifications"
dragTarget: notificationCenter
- minimumY: -notificationCenter.height
- maximumY: 0
- onActiveChanged: {
- if (active) {
- notificationHandle.prevDragY = notificationHandle.dragTarget.y;
- } else {
- if (!notificationHandle.dragActive && notificationHandle.swipe) {
- if (notificationCenter.openNotificationCenter && notificationHandle.dragDelta > 0) {
- notificationCenter.openNotificationCenter = true;
- } else if (notificationCenter.openNotificationCenter && notificationHandle.dragDelta < 0) {
- notificationCenter.openNotificationCenter = false;
- } else {
- notificationCenter.openNotificationCenter = !notificationCenter.openNotificationCenter;
- }
+ parentRotation: root.rotation
+
+ onReleased: {
+ if (notificationCenter.state === "intermediate_from_closed"
+ || notificationCenter.state === "intermediate_from_all")
+ {
+ if (-notificationCenter.y < notificationCenter.allNotificationsHeight / 2) {
+ notificationCenter.state = "allNotifications";
} else {
- notificationCenter.openNotificationCenter = !notificationCenter.openNotificationCenter;
+ notificationCenter.state = "closed";
}
-
- // stop drag filter timer
- notificationHandle.dragFilterTimer.running = false;
- notificationHandle.dragDelta = (notificationCenter.y - notificationHandle.dragOrigin + Sizes.dp(130));
+ } else if (notificationCenter.state === "allNotifications") {
+ notificationCenter.state = "closed";
+ } else {
+ notificationCenter.state = "allNotifications";
}
}
-
- onClicked: {
- //open notificationCenter
- notificationCenter.openNotificationCenter = !notificationCenter.openNotificationCenter;
- }
-
- onPressed: {
- // reset values
- notificationHandle.dragDelta = 0;
- notificationHandle.dragOrigin = notificationHandle.dragTarget.y;
- notificationHandle.prevDragY = notificationHandle.dragTarget.y;
-
- // start drag filter timer
- notificationHandle.dragFilterTimer.running = true;
- }
}
}
diff --git a/sysui/notification/NotificationHandle.qml b/sysui/notification/NotificationHandle.qml
index 94d65f8f..25fcb875 100644
--- a/sysui/notification/NotificationHandle.qml
+++ b/sysui/notification/NotificationHandle.qml
@@ -43,30 +43,51 @@ ToolButton {
implicitWidth: root.notificationCounterVisible ? Sizes.dp(255) : Sizes.dp(205)
implicitHeight: Sizes.dp(Config.statusBarHeight)
- property alias dragActive: handler.active
- property alias dragTarget: handler.target
- property int prevDragY: 0
- property int dragDelta: 0
- property int dragOrigin: 0
- property int minimumY: 0
- property int maximumY: 0
-
- property bool swipe: Math.abs(root.prevDragY - root.dragTarget.y) > 0
-
- property alias dragFilterTimer: dragFilterTimer
-
property int notificationCount
property bool notificationCounterVisible
- signal activeChanged(var active)
+ property var dragTarget
+ property int parentRotation
+
+ QtObject {
+ id: d
+ property int prevDragY
+ }
DragHandler {
id: handler
- target: root.dragTarget
- yAxis.minimum: root.minimumY
- yAxis.maximum: root.maximumY
+ target: root
+ onTranslationChanged: {
+ var dt = Math.sin(parentRotation* (180 / Math.PI)) * translation.x
+ + Math.cos(parentRotation* (180 / Math.PI)) * translation.y ;
+ if (dragTarget.state === "intermediate_from_closed") {
+ if (dt > 0) { // from close -> open
+ var delta = dt < dragTarget.allNotificationsHeight
+ ? dt
+ : dragTarget.allNotificationsHeight;
+ dragTarget.y = d.prevDragY + delta;
+ }
+ } else if (dragTarget.state === "intermediate_from_all") {
+ if (dt < 0) { // from open -> close
+ delta = (dt + dragTarget.allNotificationsHeight) > 0
+ ? dt
+ : -dragTarget.allNotificationsHeight;
+ dragTarget.y = d.prevDragY + delta;
+ }
+ }
+ }
onActiveChanged: {
- root.activeChanged(active);
+ if (active) {
+ if (dragTarget.state === "closed") {
+ dragTarget.state = "intermediate_from_closed";
+ d.prevDragY = dragTarget.y;
+ } else if (dragTarget.state === "allNotifications") {
+ dragTarget.state = "intermediate_from_all";
+ d.prevDragY = dragTarget.y;
+ }
+ } else {
+ root.released()
+ }
}
}
@@ -77,48 +98,113 @@ ToolButton {
anchors.horizontalCenter: parent.horizontalCenter
Rectangle {
- anchors.verticalCenter: parent.verticalCenter
- width: root.notificationCounterVisible ? Sizes.dp(100) : Sizes.dp(200)
+ width: Sizes.dp(100)
height: Sizes.dp(4)
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.right: countRect.left
color: Style.contrastColor
}
Rectangle {
+ id: countRect
+
width: Sizes.dp(45)
- height: Sizes.dp(30)
- radius: height / 2
+ height: Sizes.dp(4)
anchors.centerIn: parent
- opacity: root.notificationCounterVisible ? 1 : 0
- visible: opacity > 0
- color: "transparent"
+ color: Style.contrastColor
border.color: Style.contrastColor
Label {
id: countLabel
+
anchors.centerIn: parent
font.pixelSize: Sizes.fontSizeXS
text: root.notificationCount
color: Style.contrastColor
+ visible: false
}
}
Rectangle {
width: Sizes.dp(100)
height: Sizes.dp(4)
- anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
- opacity: root.notificationCounterVisible ? 1 : 0
- visible: opacity > 0
+ anchors.left: countRect.right
color: Style.contrastColor
}
}
- Timer {
- id: dragFilterTimer
- interval: 100
- repeat: true
- onTriggered: {
- root.prevDragY = root.dragTarget.y;
+ states: [
+ State {
+ name: "notificationCounterVisible"
+ when: root.notificationCounterVisible
+ changes: [
+ PropertyChanges {
+ target: countRect
+ height: Sizes.dp(30)
+ radius: height / 2
+ color: "transparent"
+ },
+ PropertyChanges {
+ target: countLabel
+ visible: true
+ }
+ ]
+ },
+ State {
+ name: "notificationCounterInvisible"
+ when: !root.notificationCounterVisible
+ changes: [
+ PropertyChanges {
+ target: countRect
+ height: Sizes.dp(4)
+ radius: 0
+ color: Style.contrastColor
+ },
+ PropertyChanges {
+ target: countLabel
+ visible: false
+ }
+ ]
}
- }
+ ]
+
+ transitions: [
+ Transition {
+ to: "notificationCounterInvisible"
+ SequentialAnimation {
+ PauseAnimation {
+ duration: 400
+ }
+ PropertyAction {
+ target: countLabel
+ property: "visible"
+ value: false
+ }
+ NumberAnimation {
+ target: countRect
+ properties: "height, radius"
+ duration: 200
+ }
+ }
+ },
+ Transition {
+ to: "notificationCounterVisible"
+ SequentialAnimation {
+ PauseAnimation {
+ duration: 400
+ }
+ NumberAnimation {
+ target: countRect
+ properties: "height, radius"
+ duration: 200
+ }
+ PropertyAction {
+ target: countLabel
+ property: "visible"
+ value: true
+ }
+ }
+ }
+ ]
}
diff --git a/sysui/notification/NotificationToast.qml b/sysui/notification/NotificationToast.qml
index e44f7f9e..142a352c 100644
--- a/sysui/notification/NotificationToast.qml
+++ b/sysui/notification/NotificationToast.qml
@@ -55,7 +55,7 @@ NotificationItem {
Connections {
target: root.notificationModel
- onNotificationAdded: {
+ function onNotificationAdded() {
var currentNotification = root.notificationModel.model.get(root.notificationModel.count - 1);
priv.notificationId = currentNotification.id;
root.notificationIcon = currentNotification.icon;
@@ -71,7 +71,7 @@ NotificationItem {
}
}
- onNotificationClosed: {
+ function onNotificationClosed() {
priv.notificationId = -1;
}
}
diff --git a/sysui/statusbar/+lucee/StatusBar.qml b/sysui/statusbar/+lucee/StatusBar.qml
index a562e8b3..bab1efbf 100644
--- a/sysui/statusbar/+lucee/StatusBar.qml
+++ b/sysui/statusbar/+lucee/StatusBar.qml
@@ -31,6 +31,7 @@
****************************************************************************/
import QtQuick 2.6
+import QtQml 2.14
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
@@ -55,7 +56,10 @@ Item {
popupX: (root.LayoutMirroring.enabled ? root.parent.width - width - Sizes.dp(5) : Sizes.dp(5))
popupY: originPos.y
originItem: volumeIcon
- Binding { target: volumePopup.item; property: "model"; value: root.model.volumeStore }
+ Binding {
+ restoreMode: Binding.RestoreBinding
+ target: volumePopup.item; property: "model"; value: root.model.volumeStore;
+ }
}
property var voiceAssitantWindow
@@ -68,7 +72,8 @@ Item {
spacing: Sizes.dp(5)
ToolButton {
- Layout.preferredWidth: Sizes.dp(60)
+ padding: 0
+ Layout.preferredWidth: Sizes.dp(64)
Layout.fillHeight: true
id: volumeIcon
objectName: "volumePopupButton"
diff --git a/sysui/stores/ClusterStore.qml b/sysui/stores/ClusterStore.qml
index c678ac79..c5266cf3 100644
--- a/sysui/stores/ClusterStore.qml
+++ b/sysui/stores/ClusterStore.qml
@@ -31,6 +31,7 @@
****************************************************************************/
import QtQuick 2.8
+import QtQml 2.14
import QtApplicationManager.SystemUI 2.0
import shared.com.pelagicore.remotesettings 1.0
import shared.com.pelagicore.drivedata 1.0
@@ -48,6 +49,7 @@ QtObject {
readonly property var clusterScreen: Qt.application.screens.length > 1
? Qt.application.screens[1] : Qt.application.screens[0]
readonly property var _clusterAvailableBinding: Binding {
+ restoreMode: Binding.RestoreBinding
target: clusterSettings
when: clusterSettings.isInitialized
property: "available"
@@ -63,15 +65,22 @@ QtObject {
property int clusterPosition: 1 // 0: top 1: center 2: bottom
onClusterScreenChanged: {
- if (qsrEnabled || !adjustSizesForScreen) {
- desktopWidth = Config.instrumentClusterWidth;
- desktopHeight = Config.instrumentClusterHeight;
- } else {
+ if (adjustSizesForScreen) {
var tempWidth = Math.ceil(clusterScreen.width * 0.9);
desktopWidth = tempWidth > Config.instrumentClusterWidth
? Config.instrumentClusterWidth
: tempWidth;
- desktopHeight = Math.ceil(desktopWidth / Config.instrumentClusterUIAspectRatio);
+ if (qsrEnabled) {
+ // Desktop demo case: make window 20% higher than cluster panel, so qsr
+ // window will not overlap cluster window title bar
+ desktopHeight = Math.ceil(desktopWidth / Config.instrumentClusterUIAspectRatio
+ * 1.2);
+ } else {
+ desktopHeight = Math.ceil(desktopWidth / Config.instrumentClusterUIAspectRatio);
+ }
+ } else {
+ desktopWidth = Config.instrumentClusterWidth;
+ desktopHeight = Config.instrumentClusterHeight;
}
}
}
diff --git a/sysui/stores/MusicAppRequestsIPCStore.qml b/sysui/stores/MusicAppRequestsIPCStore.qml
index f3c65407..4e54d234 100644
--- a/sysui/stores/MusicAppRequestsIPCStore.qml
+++ b/sysui/stores/MusicAppRequestsIPCStore.qml
@@ -73,7 +73,7 @@ ApplicationIPCInterface {
property var appmanCnx: Connections {
target: ApplicationManager
- onApplicationAdded: {
+ function onApplicationAdded(id) {
if (id === "com.pelagicore.spotify") {
root.spotifyInstalled = true;
}
@@ -81,7 +81,7 @@ ApplicationIPCInterface {
root.webradioInstalled = true;
}
}
- onApplicationAboutToBeRemoved: {
+ function onApplicationAboutToBeRemoved(id) {
if (id === "com.pelagicore.spotify") {
root.spotifyInstalled = false;
}
diff --git a/sysui/stores/MusicStore.qml b/sysui/stores/MusicStore.qml
new file mode 100644
index 00000000..204f4f09
--- /dev/null
+++ b/sysui/stores/MusicStore.qml
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Luxoft Sweden AB
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Neptune 3 UI.
+**
+** $QT_BEGIN_LICENSE:GPL-QTAS$
+** Commercial License Usage
+** Licensees holding valid commercial Qt Automotive Suite 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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.6
+import QtApplicationManager 2.0
+
+QtObject {
+ id: root
+
+ function sendIntent(command) {
+ var request = IntentClient.sendIntentRequest("music-command", { musiccommand: command })
+ request.onReplyReceived.connect(function() {
+ if (request.succeeded)
+ var result = request.result
+ else
+ console.log("Intent request failed: " + request.errorMessage)
+ })
+ }
+}
diff --git a/sysui/stores/RootStore.qml b/sysui/stores/RootStore.qml
index 59680983..0e574fb8 100644
--- a/sysui/stores/RootStore.qml
+++ b/sysui/stores/RootStore.qml
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 Luxoft Sweden AB
+** Copyright (C) 2019-2020 Luxoft Sweden AB
** Copyright (C) 2018 Pelagicore AG
** Contact: https://www.qt.io/licensing/
**
@@ -52,11 +52,15 @@ Store {
readonly property ClusterStore clusterStore: ClusterStore { id: clusterStore }
readonly property HUDStore hudStore: HUDStore {}
readonly property CenterConsoleStore centerConsole: CenterConsoleStore {}
+ readonly property MusicStore musicStore: MusicStore {}
readonly property string hardwareVariant: ApplicationManager.systemProperties.hardwareVariant
property alias clusterAvailable: clusterStore.clusterAvailable
readonly property bool enableCursorManagement: ApplicationManager.systemProperties.enableCursorManagement
- onEnableCursorManagementChanged: { Config.enableCursorManagement = root.enableCursorManagement; }
+ onEnableCursorManagementChanged: {
+ Config.cursorAngleOffset =Qt.binding(function(){return centerConsole.isLandscape ? 90 : 0});
+ Config.enableCursorManagement = root.enableCursorManagement;
+ }
readonly property bool devMode: ApplicationManager.systemProperties.devMode
@@ -73,7 +77,6 @@ Store {
readonly property var applicationModel: ApplicationModel {
id: applicationModel
localeCode: Config.languageLocale
- autostartApps: settingsStore.value("autostartApps", settingsStore.defaultAutostartApps)
showCluster: (WindowManager.runningOnDesktop || Qt.application.screens.length > 1) && root.clusterStore.showCluster
showHUD: root.hudStore.showHUD
@@ -96,11 +99,17 @@ Store {
onAutostartAppsListChanged: { settingsStore.setValue("autostartApps", applicationModel.serializeAutostart()); }
onAutorecoverAppsListChanged: { settingsStore.setValue("autorecoverApps", applicationModel.serializeAutorecover()); }
onApplicationPopupAdded: applicationPopupsStore.appPopupsModel.append({"window":window});
+ onWidgetStatesChanged: {
+ settingsStore.setValue("widgetStates", applicationModel.serializeWidgetStates());
+ }
}
readonly property ApplicationPopupsStore applicationPopupsStore: ApplicationPopupsStore {}
- property bool startupAccentColor: true
+
+ property var chosenColor: {0: Config._initAccentColors(0)[1].color
+ , 1: Config._initAccentColors(1)[4].color}
+
readonly property SystemUI systemUISettings: SystemUI {
id: systemUISettings
onApplicationICWindowSwitchCountChanged: {
@@ -116,24 +125,29 @@ Store {
onLanguageChanged: {
if (language !== Config.languageLocale) {
Config.languageLocale = language;
+ uiSettings.setRtlMode(Qt.locale(language).textDirection === Qt.RightToLeft)
}
}
- onThemeChanged: root.updateThemeRequested(uiSettings.theme)
+
+ onThemeChanged: {
+ if (isInitialized) {
+ root.updateThemeRequested(uiSettings.theme);
+ //different themes have different color pallets, we update colors on theme change
+ uiSettings.accentColor = chosenColor[uiSettings.theme];
+ }
+ }
+
onAccentColorChanged: {
- root.accentColorChanged(accentColor);
- if (startupAccentColor) {
- //Prevent setting back light theme's last accent color in cases when the UI
- //was closed with light theme set. If this is the case, reset dark theme's
- //default accent color.
- var accColorInPalette = root.accentColorsModel.find(function(color) {
- return (color.color === accentColor);
- });
- if (accColorInPalette === undefined) {
- uiSettings.accentColor = root.accentColorsModel[0].color;
+ if (isInitialized) {
+ if (Config._initAccentColors(uiSettings.theme)
+ .some(data => data.color === uiSettings.accentColor)) {
+ chosenColor[uiSettings.theme] = uiSettings.accentColor;
}
- startupAccentColor = false;
+
+ root.accentColorChanged(accentColor);
}
}
+
onRtlModeChanged: Config.rtlMode = uiSettings.rtlMode
Component.onCompleted: {
Qt.callLater(function() {
@@ -153,6 +167,11 @@ Store {
uiSettings.setLanguage("en_US");
}
}
+ // first connection of SystemUI to UISettings backend, got all variables
+ // from it, init available translations if languages list is empty
+ if (languages.length === 0) {
+ languages = Config.translation.availableTranslations;
+ }
}
}
@@ -185,6 +204,45 @@ Store {
readonly property bool runningOnSingleScreenEmbedded: !WindowManager.runningOnDesktop
&& (Qt.application.screens.length === 1)
+ readonly property Connections instentServerConnection: Connections {
+ target: IntentServer
+ function onDisambiguationRequest(requestId, potentialIntents, parameters) {
+ //process "activate-app" intent sent with part of app name (guess-app) as parameter
+ if (potentialIntents.length > 0 && potentialIntents[0].intentId === "activate-app") {
+ var guess_app = parameters["guess-app"];
+ if (guess_app && guess_app !== "") {
+ if (guess_app === "home") {
+ // if "home" is called, go to home view
+ applicationModel.goHome();
+ }
+
+ var appId = "";
+
+ for (var i = 0; i < potentialIntents.length; i++) {
+ if (potentialIntents[i].applicationId.includes(guess_app)) {
+ appId = potentialIntents[i].applicationId;
+ break;
+ }
+ }
+
+ //found app with "guess-app" part, send intent to this app
+ if (appId !== "") {
+ let request = IntentClient.sendIntentRequest("activate-app", appId, { });
+ request.onReplyReceived.connect(function() {
+ if (request.succeeded) {
+ var result = request.result;
+ console.log(Logging.apps, "Intent result: " + result.done);
+ } else {
+ console.log(Logging.apps, "Intent request failed: ",
+ request.errorMessage);
+ }
+ });
+ }
+ }
+ }
+ }
+ }
+
signal updateThemeRequested(var currentTheme)
signal accentColorChanged(var newAccentColor)
signal grabImageRequested(var screenshotCCPath, var screenshotICPath)
@@ -228,25 +286,20 @@ Store {
root.triggerNotificationInfo(tempDirPath);
}
+ //value: 1 -- dark, 0 -- light
function updateTheme(value) {
- if ((value === 1) && (root.lighThemeLastAccColor !== uiSettings.accentColor)) {
- root.lighThemeLastAccColor = uiSettings.accentColor;
- } else if ((value === 0) && (root.darkThemeLastAccColor !== uiSettings.accentColor)) {
- root.darkThemeLastAccColor = uiSettings.accentColor;
- }
- uiSettings.setTheme(value);
- root.accentColorsModel = Config._initAccentColors(value);
- //set previous to theme accentColor
- if ((lighThemeLastAccColor !== "") && (value === 0)) {
- uiSettings.accentColor = root.lighThemeLastAccColor;
- } else if ((darkThemeLastAccColor !== "") && (value === 1)) {
- uiSettings.accentColor = root.darkThemeLastAccColor;
- } else {
- uiSettings.accentColor = root.accentColorsModel[0].color;
+ if (value !== uiSettings.theme) {
+ uiSettings.setTheme(value);
}
}
- Component.onCompleted: {
- root.accentColorsModel = Config._initAccentColors(Style.theme);
+ function triggerVoiceAssitant() {
+ var request = IntentClient.sendIntentRequest("trigger-voiceassistant", { });
+ request.onReplyReceived.connect(function() {
+ if (request.succeeded)
+ var result = request.result;
+ else
+ console.log("Intent request failed: " + request.errorMessage);
+ })
}
}
diff --git a/sysui/stores/VolumeStore.qml b/sysui/stores/VolumeStore.qml
index 272d733a..0ea33884 100644
--- a/sysui/stores/VolumeStore.qml
+++ b/sysui/stores/VolumeStore.qml
@@ -36,7 +36,12 @@ import QtIvi.Media 1.0
QtObject {
id: root
- readonly property MediaPlayer player: MediaPlayer { id: player }
+ readonly property MediaPlayer player: MediaPlayer {
+ id: player
+ Component.onCompleted: {
+ player.volume = root.volume;
+ }
+ }
property var uiSettings
diff --git a/tests/dummyimports/QtApplicationManager/SystemUI/WindowManager.qml b/tests/dummyimports/QtApplicationManager/SystemUI/WindowManager.qml
index e24c34b4..983f64c5 100644
--- a/tests/dummyimports/QtApplicationManager/SystemUI/WindowManager.qml
+++ b/tests/dummyimports/QtApplicationManager/SystemUI/WindowManager.qml
@@ -40,7 +40,7 @@ QtObject {
property var surfaceItems: []
property Connections conn: Connections {
target: ApplicationManager
- onEmitSurface: {
+ function onEmitSurface(index, item) {
surfaceItems[index] = item
root.surfaceItemReady(index, item)
}
diff --git a/tests/neptune-qmlscene/neptune-qmlscene.cpp b/tests/neptune-qmlscene/neptune-qmlscene.cpp
index 74c442e3..b3750875 100644
--- a/tests/neptune-qmlscene/neptune-qmlscene.cpp
+++ b/tests/neptune-qmlscene/neptune-qmlscene.cpp
@@ -361,6 +361,8 @@ static void usage()
puts(" -I <path> ........................ Add <path> to the list of import paths");
puts(" -P <path> ........................ Add <path> to the list of plugin paths");
puts(" -translation <translationfile> ... Set the language to run in");
+ puts(" --style-conf <style conf file> ... Sets QT_QUICK_CONTROLS_CONF");
+ puts(" --styles-path <styles path> ...... Sets QT_QUICK_CONTROLS_STYLE_PATH");
puts(" ");
exit(1);
@@ -529,6 +531,10 @@ int main(int argc, char ** argv)
imports.append(arguments.at(++i));
else if (lowerArgument == QLatin1String("-p") && i + 1 < size)
pluginPaths.append(arguments.at(++i));
+ else if (lowerArgument == QLatin1String("--style-conf") && i + 1 < size)
+ qputenv("QT_QUICK_CONTROLS_CONF", arguments.at(++i).toLocal8Bit());
+ else if (lowerArgument == QLatin1String("--styles-path") && i + 1 < size)
+ qputenv("QT_QUICK_CONTROLS_STYLE_PATH", arguments.at(++i).toLocal8Bit());
else if (lowerArgument == QLatin1String("--help")
|| lowerArgument == QLatin1String("-help")
|| lowerArgument == QLatin1String("--h")
diff --git a/tests/qmltests/qmltests.pro b/tests/qmltests/qmltests.pro
index 0f9768dc..1e90496d 100644
--- a/tests/qmltests/qmltests.pro
+++ b/tests/qmltests/qmltests.pro
@@ -16,6 +16,11 @@ win32 {
CONFIG += qmltestcase
+# these defines Styles for qml as it is not possible to set them via Qt Test
+# used to set env variables
+DEFINES *= STYLE_CONF_PATH=\""\\\"$$BUILD_DIR/styles/neptune/style.conf\\\""\"
+DEFINES *= STYLES_PATH=\""\\\"$$BUILD_DIR/styles\\\""\"
+
# TODO: Check what is the import precedence to ensure Qt looks for modules first in the
# build dir and only after in the installation dir.
IMPORTPATH = $$BUILD_DIR/imports_shared \
@@ -36,5 +41,7 @@ for(COMPONENT_NAME, COMPONENT_NAMES) {
!isEmpty(IMPORTPATH) {
for(import, IMPORTPATH): $${targetName}.commands += -I \"$$import\"
}
+ $${targetName}.commands += --style-conf $$BUILD_DIR/styles/neptune/style.conf
+ $${targetName}.commands += --styles-path $$BUILD_DIR/styles
$${targetName}.commands += $$PWD/tst_$${COMPONENT_NAME}.qml
}
diff --git a/tests/qmltests/testrunner.cpp b/tests/qmltests/testrunner.cpp
index 663febe9..1477c373 100644
--- a/tests/qmltests/testrunner.cpp
+++ b/tests/qmltests/testrunner.cpp
@@ -1,2 +1,6 @@
#include <QtQuickTest/quicktest.h>
+
+static bool s_styleConfig = qputenv("QT_QUICK_CONTROLS_CONF", STYLE_CONF_PATH);
+static bool s_stylesPath = qputenv("QT_QUICK_CONTROLS_STYLE_PATH", STYLES_PATH);
+
QUICK_TEST_MAIN(neptune-qmltests)
diff --git a/win32/server.conf b/win32/server.conf
index 67d55eab..8a73dbd7 100644
--- a/win32/server.conf
+++ b/win32/server.conf
@@ -3,3 +3,6 @@ Registry=tcp://127.0.0.1:9999
[drivedata]
Registry=tcp://127.0.0.1:9998
+
+[qtivimedia]
+Registry=tcp://127.0.0.1:9997