From d68e5586492ec101cd63457aeca5651bdf591a03 Mon Sep 17 00:00:00 2001 From: DoinLakeFlyer Date: Thu, 30 Apr 2020 13:11:19 -0700 Subject: [PATCH] Major update to simplify and document the custom build example --- custom-example/README.jpg | Bin 0 -> 173756 bytes custom-example/README.md | 35 +- custom-example/custom.pri | 42 +- custom-example/custom.qrc | 37 +- custom-example/qgcresources.exclusion | 2 + custom-example/qgcresources.qrc | 103 ++ custom-example/qgroundcontrol.exclusion | 0 custom-example/qgroundcontrol.qrc | 314 +++++ custom-example/res/CustomCameraControl.qml | 1029 ----------------- custom-example/res/CustomFlyView.qml | 736 ------------ custom-example/res/CustomFlyViewOverlay.qml | 390 +++++++ custom-example/res/Images/CustomAppIcon.png | Bin 0 -> 139148 bytes .../res/Images/CustomVehicleIcon.svg | 7 + custom-example/res/Images/PairingButton.svg | 23 - .../res/Images/PairingConnected.svg | 44 - custom-example/res/Images/PairingError.svg | 11 - custom-example/res/Images/PairingIcon.svg | 31 - .../res/Images/PairingIconLight.svg | 29 - custom-example/res/Images/camera_photo.svg | 15 - custom-example/res/Images/camera_settings.svg | 12 - custom-example/res/Images/camera_video.svg | 10 - custom-example/res/Images/gimbal_icon.svg | 26 - custom-example/res/Images/gimbal_pitch.svg | 11 - .../res/Images/gimbal_pitch_indoors.svg | 11 - .../res/Images/gimbal_pitch_outdoors.svg | 11 - custom-example/res/Images/gimbal_position.svg | 10 - .../res/Images/thermal-brightness.svg | 19 - custom-example/res/Images/thermal-palette.svg | 17 - custom-example/res/Images/thermal-pip.svg | 11 - .../res/Images/thermal-standard.svg | 9 - .../res/MainToolbar/CustomArmedIndicator.qml | 56 - .../MainToolbar/CustomBatteryIndicator.qml | 207 ---- .../res/MainToolbar/CustomGPSIndicator.qml | 120 -- .../res/MainToolbar/CustomMainToolBar.qml | 286 ----- .../CustomMainToolBarIndicators.qml | 123 -- .../res/MainToolbar/CustomModeIndicator.qml | 101 -- .../CustomMultiVehicleSelector.qml | 104 -- .../res/MainToolbar/CustomRCRSSIIndicator.qml | 101 -- custom-example/res/PairingIndicator.qml | 518 --------- custom-example/res/PreFlightCheckList.qml | 175 --- .../AutoPilotPlugin/CustomAutoPilotPlugin.cc | 42 +- .../AutoPilotPlugin/CustomAutoPilotPlugin.h | 6 +- custom-example/src/CustomPlugin.cc | 197 ++-- custom-example/src/CustomPlugin.h | 69 +- custom-example/src/CustomQuickInterface.cc | 77 -- custom-example/src/CustomQuickInterface.h | 48 - custom-example/src/CustomVideoManager.cc | 29 - custom-example/src/CustomVideoManager.h | 28 - .../src/FirmwarePlugin/CustomCameraControl.cc | 134 --- .../src/FirmwarePlugin/CustomCameraControl.h | 47 - .../src/FirmwarePlugin/CustomCameraManager.cc | 21 - .../src/FirmwarePlugin/CustomCameraManager.h | 24 - .../FirmwarePlugin/CustomFirmwarePlugin.cc | 49 +- .../src/FirmwarePlugin/CustomFirmwarePlugin.h | 9 +- .../CustomFirmwarePluginFactory.cc | 12 +- .../CustomFirmwarePluginFactory.h | 10 +- custom-example/updateqrc.py | 38 + src/QGCApplication.cc | 3 +- src/api/QGCCorePlugin.cc | 20 +- src/api/QGCCorePlugin.h | 6 +- 60 files changed, 1051 insertions(+), 4604 deletions(-) create mode 100644 custom-example/README.jpg create mode 100644 custom-example/qgcresources.exclusion create mode 100644 custom-example/qgcresources.qrc create mode 100644 custom-example/qgroundcontrol.exclusion create mode 100644 custom-example/qgroundcontrol.qrc delete mode 100644 custom-example/res/CustomCameraControl.qml delete mode 100644 custom-example/res/CustomFlyView.qml create mode 100644 custom-example/res/CustomFlyViewOverlay.qml create mode 100644 custom-example/res/Images/CustomAppIcon.png create mode 100644 custom-example/res/Images/CustomVehicleIcon.svg delete mode 100644 custom-example/res/Images/PairingButton.svg delete mode 100644 custom-example/res/Images/PairingConnected.svg delete mode 100644 custom-example/res/Images/PairingError.svg delete mode 100644 custom-example/res/Images/PairingIcon.svg delete mode 100644 custom-example/res/Images/PairingIconLight.svg delete mode 100644 custom-example/res/Images/camera_photo.svg delete mode 100644 custom-example/res/Images/camera_settings.svg delete mode 100644 custom-example/res/Images/camera_video.svg delete mode 100644 custom-example/res/Images/gimbal_icon.svg delete mode 100644 custom-example/res/Images/gimbal_pitch.svg delete mode 100644 custom-example/res/Images/gimbal_pitch_indoors.svg delete mode 100644 custom-example/res/Images/gimbal_pitch_outdoors.svg delete mode 100644 custom-example/res/Images/gimbal_position.svg delete mode 100644 custom-example/res/Images/thermal-brightness.svg delete mode 100644 custom-example/res/Images/thermal-palette.svg delete mode 100644 custom-example/res/Images/thermal-pip.svg delete mode 100644 custom-example/res/Images/thermal-standard.svg delete mode 100644 custom-example/res/MainToolbar/CustomArmedIndicator.qml delete mode 100644 custom-example/res/MainToolbar/CustomBatteryIndicator.qml delete mode 100644 custom-example/res/MainToolbar/CustomGPSIndicator.qml delete mode 100644 custom-example/res/MainToolbar/CustomMainToolBar.qml delete mode 100644 custom-example/res/MainToolbar/CustomMainToolBarIndicators.qml delete mode 100644 custom-example/res/MainToolbar/CustomModeIndicator.qml delete mode 100644 custom-example/res/MainToolbar/CustomMultiVehicleSelector.qml delete mode 100644 custom-example/res/MainToolbar/CustomRCRSSIIndicator.qml delete mode 100644 custom-example/res/PairingIndicator.qml delete mode 100644 custom-example/res/PreFlightCheckList.qml delete mode 100644 custom-example/src/CustomQuickInterface.cc delete mode 100644 custom-example/src/CustomQuickInterface.h delete mode 100644 custom-example/src/CustomVideoManager.cc delete mode 100644 custom-example/src/CustomVideoManager.h delete mode 100644 custom-example/src/FirmwarePlugin/CustomCameraControl.cc delete mode 100644 custom-example/src/FirmwarePlugin/CustomCameraControl.h delete mode 100644 custom-example/src/FirmwarePlugin/CustomCameraManager.cc delete mode 100644 custom-example/src/FirmwarePlugin/CustomCameraManager.h create mode 100755 custom-example/updateqrc.py diff --git a/custom-example/README.jpg b/custom-example/README.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea4f0c77a8c1f29686002378286d949bdf4c4d4c GIT binary patch literal 173756 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 literal 0 HcmV?d00001 diff --git a/custom-example/README.md b/custom-example/README.md index eee240f38..529d6d290 100644 --- a/custom-example/README.md +++ b/custom-example/README.md @@ -2,27 +2,26 @@ ## Custom Build Example -To build this sample custom version, simply rename the directory from `custom-example` to `custom` before running `qmake` (or launching Qt Creator.) The build system will automatically find anything in `custom` and incorporate it into the build. If you had already run a build before renaming the directory, delete the build directory before running `qmake`. To restore the build to a stock QGroundControl one, rename the directory back to `custom-example` (making sure to clean the build directory again.) +To build this sample custom version: -### Custom Builds +* Clean you build directory of any previous build +* Rename the directory from `custom-example` to `custom` +* Change to the `custom` directory +* Run `python updateqrc.py` +* Build QGC -The root project file (`qgroundcontrol.pro`) will look and see if `custom/custom.pri` exists. If it does, it will load it before anything else is setup. This allows you to modify the build in any way necessary for a custom build. This example shows you how to: +![Custom Build Screenshot](README.jpg) -* Fully brand your build -* Define a single flight stack to avoid carrying over unnecessary code -* Implement your own, autopilot and firmware plugin overrides -* Implement your own camera manager and plugin overrides -* Implement your own QtQuick interface module -* Implement your own toolbar, toolbar indicators and UI navigation -* Implement your own Fly View overlay (and how to hide elements from QGC such as the flight widget) -* Implement your own, custom QtQuick camera control -* Implement your own, custom Pre-flight Checklist -* Define your own resources for all of the above +More details on what a custom build is and how to create your own can be found in the [QGC Dev Guide](https://dev.qgroundcontrol.com/en/custom_build/custom_build.html). -Note that within `qgroundcontrol.pro`, most main build steps are surrounded by flags, which you can define to override them. For example, if you want to have your own Android build, done in some completely different way, you simply: +The main features of this example: -``` -DEFINES += DISABLE_BUILTIN_ANDROID -``` +* Assumes an "Off The Shelf" purchased commercial vehicle. This means most vehicle setup is hidden from the user since they should mostly never need to adjust those things. They would be set up correctly by the vehicle producing company prior to sale. +* The above assumption cause the QGC UI to adjust and not show various things. Providing an even simpler experience to the user. +* The full experience continues to be available in "Advanced Mode". +* Brands the build with various custom images and custom color palette which matches corporate branding of the theoretical commercial company this build is for. +* Customizes portions of the interface such as you can see in the above screenshot which shows a custom instrument widget replacing the standard QGC ui. +* It also overrides various QGC Application settings to hide some settings the users shouldn't modify as well as adjusting defaults for others. +* The source code is fully commented to explain what and why it is doing things. -With this defined within your `custom.pri` file, it is up to you to define how to do the Android build. You can either replace the entire process or prepare it before invoking QGC’s own Android project file on your own. You would do this if you want to have your own branding within the Android manifest. The same applies to iOS (`DISABLE_BUILTIN_IOS`). +> Important Note: This custom build is not automatically built each time regular QGC code changes. This can mean that it may fall out of date with the latest changes in QGC code. This can show up as the `python updateqrc.py` steps failing due to upstream resource changes. Or possibly fail to compile because the plugin mechanism for custom builds has changed. If this happens please notify the QGC devs and they will bring it up to date. Or even better, submit a pull for the fix yourself! \ No newline at end of file diff --git a/custom-example/custom.pri b/custom-example/custom.pri index ab24fd86f..5f68ac774 100644 --- a/custom-example/custom.pri +++ b/custom-example/custom.pri @@ -35,36 +35,32 @@ CONFIG += QGC_DISABLE_PX4_PLUGIN_FACTORY DEFINES += CUSTOMHEADER=\"\\\"CustomPlugin.h\\\"\" DEFINES += CUSTOMCLASS=CustomPlugin -TARGET = CustomQGC -DEFINES += QGC_APPLICATION_NAME=\"\\\"CustomQGC\\\"\" +TARGET = MyGroundStation +DEFINES += QGC_APPLICATION_NAME='"\\\"Custom QGroundControl\\\""' DEFINES += QGC_ORG_NAME=\"\\\"qgroundcontrol.org\\\"\" DEFINES += QGC_ORG_DOMAIN=\"\\\"org.qgroundcontrol\\\"\" -QGC_APP_NAME = "Custom GS" -QGC_BINARY_NAME = "CustomQGC" +QGC_APP_NAME = "Custom QGroundControl" +QGC_BINARY_NAME = "CustomQGroundControl" QGC_ORG_NAME = "Custom" -QGC_ORG_DOMAIN = "org.qgroundcontrol" -QGC_APP_DESCRIPTION = "Custom QGC Ground Station" -QGC_APP_COPYRIGHT = "Copyright (C) 2019 QGroundControl Development Team. All rights reserved." +QGC_ORG_DOMAIN = "org.custom" +QGC_APP_DESCRIPTION = "Custom QGroundControl" +QGC_APP_COPYRIGHT = "Copyright (C) 2020 QGroundControl Development Team. All rights reserved." # Our own, custom resources RESOURCES += \ - $$QGCROOT/custom/custom.qrc + $$PWD/custom.qrc QML_IMPORT_PATH += \ - $$QGCROOT/custom/res + $$PWD/res # Our own, custom sources SOURCES += \ $$PWD/src/CustomPlugin.cc \ - $$PWD/src/CustomQuickInterface.cc \ - $$PWD/src/CustomVideoManager.cc HEADERS += \ $$PWD/src/CustomPlugin.h \ - $$PWD/src/CustomQuickInterface.h \ - $$PWD/src/CustomVideoManager.h INCLUDEPATH += \ $$PWD/src \ @@ -73,20 +69,16 @@ INCLUDEPATH += \ # Custom Firmware/AutoPilot Plugin INCLUDEPATH += \ - $$QGCROOT/custom/src/FirmwarePlugin \ - $$QGCROOT/custom/src/AutoPilotPlugin + $$PWD/src/FirmwarePlugin \ + $$PWD/src/AutoPilotPlugin HEADERS+= \ - $$QGCROOT/custom/src/AutoPilotPlugin/CustomAutoPilotPlugin.h \ - $$QGCROOT/custom/src/FirmwarePlugin/CustomCameraControl.h \ - $$QGCROOT/custom/src/FirmwarePlugin/CustomCameraManager.h \ - $$QGCROOT/custom/src/FirmwarePlugin/CustomFirmwarePlugin.h \ - $$QGCROOT/custom/src/FirmwarePlugin/CustomFirmwarePluginFactory.h \ + $$PWD/src/AutoPilotPlugin/CustomAutoPilotPlugin.h \ + $$PWD/src/FirmwarePlugin/CustomFirmwarePlugin.h \ + $$PWD/src/FirmwarePlugin/CustomFirmwarePluginFactory.h \ SOURCES += \ - $$QGCROOT/custom/src/AutoPilotPlugin/CustomAutoPilotPlugin.cc \ - $$QGCROOT/custom/src/FirmwarePlugin/CustomCameraControl.cc \ - $$QGCROOT/custom/src/FirmwarePlugin/CustomCameraManager.cc \ - $$QGCROOT/custom/src/FirmwarePlugin/CustomFirmwarePlugin.cc \ - $$QGCROOT/custom/src/FirmwarePlugin/CustomFirmwarePluginFactory.cc \ + $$PWD/src/AutoPilotPlugin/CustomAutoPilotPlugin.cc \ + $$PWD/src/FirmwarePlugin/CustomFirmwarePlugin.cc \ + $$PWD/src/FirmwarePlugin/CustomFirmwarePluginFactory.cc \ diff --git a/custom-example/custom.qrc b/custom-example/custom.qrc index 1c8f6a95f..c277e0fd6 100644 --- a/custom-example/custom.qrc +++ b/custom-example/custom.qrc @@ -1,47 +1,24 @@ - res/MainToolbar/CustomArmedIndicator.qml - res/MainToolbar/CustomBatteryIndicator.qml - res/CustomCameraControl.qml - res/CustomFlyView.qml - res/MainToolbar/CustomGPSIndicator.qml - res/MainToolbar/CustomMainToolBar.qml - res/MainToolbar/CustomMainToolBarIndicators.qml - res/MainToolbar/CustomModeIndicator.qml - res/MainToolbar/CustomMultiVehicleSelector.qml - res/MainToolbar/CustomRCRSSIIndicator.qml - res/PairingIndicator.qml - res/PreFlightCheckList.qml + res/CustomFlyViewOverlay.qml res/Images/altitude.svg res/Images/attitude_crosshair.svg res/Images/attitude_dial.svg res/Images/attitude_pointer.svg - res/Images/camera_photo.svg - res/Images/camera_settings.svg - res/Images/camera_video.svg res/Images/chronometer.svg res/Images/compass_needle.svg res/Images/compass_pointer.svg res/Images/distance.svg - res/Images/gimbal_icon.svg - res/Images/gimbal_pitch_indoors.svg - res/Images/gimbal_pitch_outdoors.svg - res/Images/gimbal_position.svg res/Images/horizontal_speed.svg res/Images/microSD.svg res/Images/odometer.svg - res/Images/PairingButton.svg - res/Images/PairingConnected.svg - res/Images/PairingError.svg - res/Images/PairingIcon.svg - res/Images/thermal-brightness.svg - res/Images/thermal-palette.svg - res/Images/thermal-pip.svg - res/Images/thermal-standard.svg res/Images/vertical_speed.svg - res/Images/void.png + res/Images/CustomAppIcon.png + + + res/Images/CustomVehicleIcon.svg res/Custom/Widgets/CustomArtificialHorizon.qml @@ -54,8 +31,4 @@ res/Custom/Widgets/CustomVehicleButton.qml res/Custom/Widgets/qmldir - - res/Custom/Camera/qmldir - res/Custom/Camera/ZoomControl.qml - diff --git a/custom-example/qgcresources.exclusion b/custom-example/qgcresources.exclusion new file mode 100644 index 000000000..24807753b --- /dev/null +++ b/custom-example/qgcresources.exclusion @@ -0,0 +1,2 @@ + src/ui/toolbar/Images/PaperPlane.svg + diff --git a/custom-example/qgcresources.qrc b/custom-example/qgcresources.qrc new file mode 100644 index 000000000..02caa15f2 --- /dev/null +++ b/custom-example/qgcresources.qrc @@ -0,0 +1,103 @@ + + + ../resources/fonts/OpenSans-Regular.ttf + ../resources/fonts/OpenSans-Semibold.ttf + ../resources/fonts/NanumGothic-Regular.ttf + ../resources/fonts/NanumGothic-Bold.ttf + + + ../resources/action.svg + ../resources/Antenna_RC.svg + ../resources/Antenna_T.svg + ../resources/ArrowDown.svg + ../resources/ArrowRight.svg + ../resources/buttonLeft.svg + ../resources/buttonRight.svg + ../resources/cancel.svg + ../resources/clockwise-arrow.svg + ../resources/counter-clockwise-arrow.svg + ../resources/chevron-down.svg + ../resources/chevron-up.svg + ../resources/DropArrow.svg + ../resources/gear-black.svg + ../resources/gear-white.svg + ../resources/helicoptericon.svg + ../resources/JoystickBezel.png + ../resources/JoystickBezelLight.png + ../resources/land.svg + ../resources/LockClosed.svg + ../resources/LockOpen.svg + ../resources/notile.png + ../resources/Pause.svg + ../resources/pause-mission.svg + ../resources/Play.svg + ../resources/PowerButton.svg + ../resources/QGCLogoBlack.svg + ../resources/QGCLogoFull.svg + ../resources/QGCLogoWhite.svg + ../resources/QGCLogoArrow.svg + ../resources/QGroundControlConnect.svg + ../resources/rtl.svg + ../resources/SplashScreen.png + ../resources/Stop.svg + ../resources/takeoff.svg + ../resources/TrashDelete.svg + ../resources/waves.svg + ../resources/wind-guru.svg + ../resources/wind-rose.svg + ../resources/wind-roseBlack.svg + ../resources/wind-rose-arrow.svg + ../resources/XDelete.svg + ../resources/XDeleteBlack.svg + ../resources/waypoint.svg + ../resources/icons/qgroundcontrol.ico + + + ../resources/firmware/3drradio.png + ../resources/firmware/apm.png + ../resources/firmware/px4.png + + + ../resources/calibration/accel_back.png + ../resources/calibration/accel_down.png + ../resources/calibration/accel_front.png + ../resources/calibration/accel_left.png + ../resources/calibration/accel_right.png + ../resources/calibration/accel_up.png + + + ../resources/calibration/mode1/radioCenter.png + ../resources/calibration/mode1/radioHome.png + ../resources/calibration/mode1/radioPitchDown.png + ../resources/calibration/mode1/radioPitchUp.png + ../resources/calibration/mode1/radioRollLeft.png + ../resources/calibration/mode1/radioRollRight.png + ../resources/calibration/mode1/radioSwitchMinMax.png + ../resources/calibration/mode1/radioThrottleDown.png + ../resources/calibration/mode1/radioThrottleUp.png + ../resources/calibration/mode1/radioYawLeft.png + ../resources/calibration/mode1/radioYawRight.png + + + ../resources/calibration/mode2/radioCenter.png + ../resources/calibration/mode2/radioHome.png + ../resources/calibration/mode2/radioPitchDown.png + ../resources/calibration/mode2/radioPitchUp.png + ../resources/calibration/mode2/radioRollLeft.png + ../resources/calibration/mode2/radioRollRight.png + ../resources/calibration/mode2/radioSwitchMinMax.png + ../resources/calibration/mode2/radioThrottleDown.png + ../resources/calibration/mode2/radioThrottleUp.png + ../resources/calibration/mode2/radioYawLeft.png + ../resources/calibration/mode2/radioYawRight.png + + + ../resources/SDL_GameControllerDB/gamecontrollerdb.txt + + + ../resources/audio/alert.wav + + + ../resources/opengl/buglist.json + + diff --git a/custom-example/qgroundcontrol.exclusion b/custom-example/qgroundcontrol.exclusion new file mode 100644 index 000000000..e69de29bb diff --git a/custom-example/qgroundcontrol.qrc b/custom-example/qgroundcontrol.qrc new file mode 100644 index 000000000..c0f7bae97 --- /dev/null +++ b/custom-example/qgroundcontrol.qrc @@ -0,0 +1,314 @@ + + + ../src/FactSystem/FactSystemTest.qml + + + ../src/ui/toolbar/ArmedIndicator.qml + ../src/ui/toolbar/BatteryIndicator.qml + ../src/ui/toolbar/GPSIndicator.qml + ../src/ui/toolbar/GPSRTKIndicator.qml + ../src/ui/toolbar/JoystickIndicator.qml + ../src/ui/toolbar/LinkIndicator.qml + ../src/ui/toolbar/MainToolBar.qml + ../src/ui/toolbar/MainToolBarIndicators.qml + ../src/ui/toolbar/MessageIndicator.qml + ../src/ui/toolbar/ModeIndicator.qml + ../src/ui/toolbar/MultiVehicleSelector.qml + ../src/ui/toolbar/RCRSSIIndicator.qml + ../src/ui/toolbar/ROIIndicator.qml + ../src/ui/toolbar/TelemetryRSSIIndicator.qml + ../src/ui/toolbar/VTOLModeIndicator.qml + + + ../src/FlightDisplay/DefaultChecklist.qml + ../src/FlightDisplay/MultiRotorChecklist.qml + ../src/FlightDisplay/FixedWingChecklist.qml + ../src/FlightDisplay/VTOLChecklist.qml + ../src/FlightDisplay/RoverChecklist.qml + ../src/FlightDisplay/SubChecklist.qml + + + ../src/QmlControls/HeightIndicator.qml + ../src/QmlControls/QGCDynamicObjectManager.qml + ../src/QmlControls/QGCOptionsComboBox.qml + ../src/PlanView/TransectStyleMapVisuals.qml + ../src/MissionManager/MapLineArrow.qml + ../src/FlightMap/MapItems/SplitIndicator.qml + ../src/AnalyzeView/AnalyzeView.qml + ../src/ui/AppSettings.qml + ../src/ui/preferences/BluetoothSettings.qml + ../src/FlightMap/Widgets/CameraPageWidget.qml + ../src/PlanView/CorridorScanEditor.qml + ../src/ViewWidgets/CustomCommandWidget.qml + ../src/ui/preferences/DebugWindow.qml + ../src/AutoPilotPlugins/Common/ESP8266Component.qml + ../src/AutoPilotPlugins/Common/ESP8266ComponentSummary.qml + ../src/ui/ExitWithErrorWindow.qml + ../src/VehicleSetup/FirmwareUpgrade.qml + ../src/FlightDisplay/FlightDisplayViewDummy.qml + ../src/FlightDisplay/FlightDisplayViewUVC.qml + ../src/PlanView/FWLandingPatternEditor.qml + ../src/ui/preferences/GeneralSettings.qml + ../src/AnalyzeView/GeoTagPage.qml + ../src/FlightMap/Widgets/HealthPageWidget.qml + ../src/ui/preferences/HelpSettings.qml + ../src/VehicleSetup/JoystickConfig.qml + ../src/VehicleSetup/JoystickConfigAdvanced.qml + ../src/VehicleSetup/JoystickConfigButtons.qml + ../src/VehicleSetup/JoystickConfigCalibration.qml + ../src/VehicleSetup/JoystickConfigGeneral.qml + ../src/ui/preferences/LinkSettings.qml + ../src/AnalyzeView/LogDownloadPage.qml + ../src/ui/preferences/LogReplaySettings.qml + ../src/ui/MainRootWindow.qml + ../src/AnalyzeView/MavlinkConsolePage.qml + ../src/AnalyzeView/MAVLinkInspectorPage.qml + ../src/ui/preferences/MavlinkSettings.qml + ../src/Microhard/MicrohardSettings.qml + ../src/PlanView/MissionSettingsEditor.qml + ../src/ui/preferences/MockLink.qml + ../src/ui/preferences/MockLinkSettings.qml + ../src/AutoPilotPlugins/Common/MotorComponent.qml + ../src/QtLocationPlugin/QMLControl/OfflineMap.qml + ../src/PlanView/PlanToolBar.qml + ../src/PlanView/PlanToolBarIndicators.qml + ../src/PlanView/PlanView.qml + ../src/FlightDisplay/PreFlightCheckList.qml + ../src/VehicleSetup/PX4FlowSensor.qml + ../src/FlightMap/Widgets/QGCInstrumentWidget.qml + ../src/FlightMap/Widgets/QGCInstrumentWidgetAlternate.qml + ../src/QmlControls/QGCViewDialogContainer.qml + ../src/AnalyzeView/AnalyzePage.qml + ../src/QmlControls/AppMessages.qml + ../src/QmlControls/AxisMonitor.qml + ../src/PlanView/CameraCalcCamera.qml + ../src/PlanView/CameraCalcGrid.qml + ../src/PlanView/CameraSection.qml + ../src/QmlControls/ClickableColor.qml + ../src/PlanView/CorridorScanMapVisual.qml + ../src/QmlControls/DeadMouseArea.qml + ../src/QmlControls/DropButton.qml + ../src/QmlControls/DropPanel.qml + ../src/QmlControls/EditPositionDialog.qml + ../src/QmlControls/ExclusiveGroupItem.qml + ../src/QmlControls/FactSliderPanel.qml + ../src/QmlControls/FileButton.qml + ../src/QmlControls/FlightModeDropdown.qml + ../src/QmlControls/FlightModeMenu.qml + ../src/PlanView/FWLandingPatternMapVisual.qml + ../src/PlanView/GeoFenceEditor.qml + ../src/PlanView/GeoFenceMapVisuals.qml + ../src/QmlControls/IndicatorButton.qml + ../src/QmlControls/InstrumentValue.qml + ../src/QmlControls/InstrumentValueArea.qml + ../src/QmlControls/InstrumentValueEditDialog.qml + ../src/QmlControls/JoystickThumbPad.qml + ../src/QmlControls/KMLOrSHPFileDialog.qml + ../src/QmlControls/LogReplayStatusBar.qml + ../src/QmlControls/MainWindowSavedState.qml + ../src/QmlControls/MAVLinkChart.qml + ../src/QmlControls/MAVLinkMessageButton.qml + ../src/QmlControls/MissionCommandDialog.qml + ../src/PlanView/MissionItemEditor.qml + ../src/QmlControls/MissionItemIndexLabel.qml + ../src/PlanView/MissionItemMapVisual.qml + ../src/PlanView/MissionItemStatus.qml + ../src/QmlControls/ModeSwitchDisplay.qml + ../src/QmlControls/MultiRotorMotorDisplay.qml + ../src/QmlControls/OfflineMapButton.qml + ../src/QmlControls/PageView.qml + ../src/QmlControls/ParameterEditor.qml + ../src/QmlControls/ParameterEditorDialog.qml + ../src/QmlControls/PIDTuning.qml + ../src/PlanView/PlanEditToolbar.qml + ../src/QmlControls/PreFlightCheckButton.qml + ../src/QmlControls/PreFlightCheckGroup.qml + ../src/QmlControls/PreFlightCheckModel.qml + ../src/QmlControls/QGCButton.qml + ../src/QmlControls/QGCCheckBox.qml + ../src/QmlControls/QGCColoredImage.qml + ../src/QmlControls/QGCComboBox.qml + ../src/QmlControls/QGCFileDialog.qml + ../src/QmlControls/QGCFlickable.qml + ../src/QmlControls/QGCFlickableHorizontalIndicator.qml + ../src/QmlControls/QGCFlickableVerticalIndicator.qml + ../src/QmlControls/QGCGroupBox.qml + ../src/QmlControls/QGCHoverButton.qml + ../src/QmlControls/QGCLabel.qml + ../src/QmlControls/QGCListView.qml + ../src/MissionManager/QGCMapCircleVisuals.qml + ../src/QmlControls/QGCMapLabel.qml + ../src/MissionManager/QGCMapPolygonVisuals.qml + ../src/MissionManager/QGCMapPolylineVisuals.qml + ../src/QmlControls/QGCMenu.qml + ../src/QmlControls/QGCMenuItem.qml + ../src/QmlControls/QGCMenuSeparator.qml + ../src/QmlControls/QGCMouseArea.qml + ../src/QmlControls/QGCMovableItem.qml + ../src/QmlControls/QGCPopupDialog.qml + ../src/QmlControls/QGCPopupDialogContainer.qml + ../src/QmlControls/QGCPipable.qml + ../src/QmlControls/QGCRadioButton.qml + ../src/QmlControls/QGCSlider.qml + ../src/QmlControls/QGCSwitch.qml + ../src/QmlControls/QGCTabBar.qml + ../src/QmlControls/QGCTabButton.qml + ../src/QmlControls/QGCTextField.qml + ../src/QmlControls/QGCToolBarButton.qml + ../src/QmlControls/QGCViewDialog.qml + ../src/QmlControls/QGCViewMessage.qml + ../src/QmlControls/QGroundControl/Controls/qmldir + ../src/PlanView/RallyPointEditorHeader.qml + ../src/PlanView/RallyPointItemEditor.qml + ../src/PlanView/RallyPointMapVisuals.qml + ../src/QmlControls/RCChannelMonitor.qml + ../src/QmlControls/RCToParamDialog.qml + ../src/QmlControls/RoundButton.qml + ../src/QmlControls/SectionHeader.qml + ../src/AutoPilotPlugins/Common/SetupPage.qml + ../src/ui/toolbar/SignalStrength.qml + ../src/PlanView/SimpleItemMapVisual.qml + ../src/QmlControls/SliderSwitch.qml + ../src/PlanView/StructureScanMapVisual.qml + ../src/QmlControls/SubMenuButton.qml + ../src/PlanView/SurveyMapVisual.qml + ../src/PlanView/TerrainStatus.qml + ../src/PlanView/TakeoffItemMapVisual.qml + ../src/QmlControls/ToolStrip.qml + ../src/PlanView/TransectStyleComplexItemStats.qml + ../src/QmlControls/VehicleRotationCal.qml + ../src/QmlControls/VehicleSummaryRow.qml + ../src/ViewWidgets/ViewWidget.qml + ../src/FactSystem/FactControls/AltitudeFactTextField.qml + ../src/FactSystem/FactControls/FactBitmask.qml + ../src/FactSystem/FactControls/FactCheckBox.qml + ../src/FactSystem/FactControls/FactComboBox.qml + ../src/FactSystem/FactControls/FactLabel.qml + ../src/FactSystem/FactControls/FactTextField.qml + ../src/FactSystem/FactControls/FactTextFieldGrid.qml + ../src/FactSystem/FactControls/FactTextFieldRow.qml + ../src/FactSystem/FactControls/FactTextFieldSlider.qml + ../src/FactSystem/FactControls/FactValueSlider.qml + ../src/QmlControls/QGroundControl/FactControls/qmldir + ../src/FlightDisplay/FlightDisplayView.qml + ../src/FlightDisplay/FlightDisplayViewMap.qml + ../src/FlightDisplay/FlightDisplayViewVideo.qml + ../src/FlightDisplay/FlightDisplayViewWidgets.qml + ../src/FlightDisplay/GuidedActionConfirm.qml + ../src/FlightDisplay/GuidedActionList.qml + ../src/FlightDisplay/GuidedActionsController.qml + ../src/FlightDisplay/GuidedAltitudeSlider.qml + ../src/FlightDisplay/MultiVehicleList.qml + ../src/FlightDisplay/PreFlightBatteryCheck.qml + ../src/FlightDisplay/PreFlightGPSCheck.qml + ../src/FlightDisplay/PreFlightRCCheck.qml + ../src/FlightDisplay/PreFlightSensorsHealthCheck.qml + ../src/FlightDisplay/PreFlightSoundCheck.qml + ../src/FlightDisplay/TerrainProgress.qml + ../src/QmlControls/QGroundControl/FlightDisplay/qmldir + ../src/FlightMap/MapItems/CameraTriggerIndicator.qml + ../src/FlightMap/Widgets/CenterMapDropButton.qml + ../src/FlightMap/Widgets/CenterMapDropPanel.qml + ../src/FlightMap/Widgets/CompassRing.qml + ../src/FlightMap/MapItems/CustomMapItems.qml + ../src/FlightMap/FlightMap.qml + ../src/FlightMap/Widgets/InstrumentSwipeView.qml + ../src/FlightMap/Widgets/MapFitFunctions.qml + ../src/FlightMap/MapScale.qml + ../src/FlightMap/MapItems/MissionItemIndicator.qml + ../src/FlightMap/MapItems/MissionItemIndicatorDrag.qml + ../src/FlightMap/MapItems/MissionItemView.qml + ../src/FlightMap/MapItems/MissionLineView.qml + ../src/FlightMap/MapItems/PlanMapItems.qml + ../src/FlightMap/MapItems/PolygonEditor.qml + ../src/FlightMap/Widgets/QGCArtificialHorizon.qml + ../src/FlightMap/Widgets/QGCAttitudeHUD.qml + ../src/FlightMap/Widgets/QGCAttitudeWidget.qml + ../src/FlightMap/Widgets/QGCCompassWidget.qml + ../src/FlightMap/Widgets/QGCPitchIndicator.qml + ../src/FlightMap/QGCVideoBackground.qml + ../src/QmlControls/QGroundControl/FlightMap/qmldir + ../src/FlightMap/MapItems/VehicleMapItem.qml + ../src/QmlControls/QGroundControl/ScreenTools/qmldir + ../src/QmlControls/ScreenTools.qml + ../src/QmlControls/QmlTest.qml + ../src/AutoPilotPlugins/Common/RadioComponent.qml + ../src/ui/preferences/SerialSettings.qml + ../src/VehicleSetup/SetupParameterEditor.qml + ../src/VehicleSetup/SetupView.qml + ../src/PlanView/SimpleItemEditor.qml + ../src/PlanView/StructureScanEditor.qml + ../src/PlanView/SurveyItemEditor.qml + ../src/AutoPilotPlugins/Common/SyslinkComponent.qml + ../src/Taisync/TaisyncSettings.qml + ../src/ui/preferences/TcpSettings.qml + ../src/test.qml + ../src/ui/preferences/UdpSettings.qml + ../src/FlightMap/Widgets/ValuePageWidget.qml + ../src/VehicleSetup/VehicleSummary.qml + ../src/FlightMap/Widgets/VibrationPageWidget.qml + ../src/FlightMap/Widgets/VideoPageWidget.qml + ../src/FlightDisplay/VirtualJoystick.qml + ../src/PlanView/VTOLLandingPatternMapVisual.qml + ../src/PlanView/VTOLLandingPatternEditor.qml + ../src/QmlControls/QGroundControl/Specific/qmldir + ../src/QmlControls/QGroundControl/Specific/StartupWizard.qml + ../src/QmlControls/QGroundControl/Specific/BaseStartupWizardPage.qml + ../src/QmlControls/QGroundControl/Specific/UnitsWizardPage.qml + + + ../src/Settings/ADSBVehicleManager.SettingsGroup.json + ../src/Settings/APMMavlinkStreamRate.SettingsGroup.json + ../src/Settings/App.SettingsGroup.json + ../src/Settings/AutoConnect.SettingsGroup.json + ../src/Settings/BrandImage.SettingsGroup.json + ../src/MissionManager/BreachReturn.FactMetaData.json + ../src/MissionManager/CameraCalc.FactMetaData.json + ../src/MissionManager/CameraSection.FactMetaData.json + ../src/MissionManager/CameraSpec.FactMetaData.json + ../src/MissionManager/CorridorScan.SettingsGroup.json + ../src/QmlControls/EditPositionDialog.FactMetaData.json + ../src/Settings/FirmwareUpgrade.SettingsGroup.json + ../src/Settings/FlightMap.SettingsGroup.json + ../src/Settings/FlyView.SettingsGroup.json + ../src/MissionManager/FWLandingPattern.FactMetaData.json + ../src/MissionManager/MavCmdInfoCommon.json + ../src/MissionManager/MavCmdInfoFixedWing.json + ../src/MissionManager/MavCmdInfoMultiRotor.json + ../src/MissionManager/MavCmdInfoRover.json + ../src/MissionManager/MavCmdInfoSub.json + ../src/MissionManager/MavCmdInfoVTOL.json + ../src/MissionManager/MissionSettings.FactMetaData.json + ../src/Settings/OfflineMaps.SettingsGroup.json + ../src/Settings/PlanView.SettingsGroup.json + ../src/MissionManager/QGCMapCircle.Facts.json + ../src/MissionManager/RallyPoint.FactMetaData.json + ../src/QmlControls/RCToParamDialog.FactMetaData.json + ../src/Settings/RTK.SettingsGroup.json + ../src/MissionManager/SpeedSection.FactMetaData.json + ../src/MissionManager/StructureScan.SettingsGroup.json + ../src/MissionManager/Survey.SettingsGroup.json + ../src/MissionManager/TransectStyle.SettingsGroup.json + ../src/Settings/Units.SettingsGroup.json + ../src/comm/USBBoardInfo.json + ../src/Vehicle/BatteryFact.json + ../src/Vehicle/ClockFact.json + ../src/Vehicle/DistanceSensorFact.json + ../src/Vehicle/EstimatorStatusFactGroup.json + ../src/Vehicle/GPSFact.json + ../src/Vehicle/GPSRTKFact.json + ../src/Vehicle/SetpointFact.json + ../src/Vehicle/SubmarineFact.json + ../src/Vehicle/TemperatureFact.json + ../src/Vehicle/TerrainFactGroup.json + ../src/Vehicle/VehicleFact.json + ../src/Vehicle/VibrationFact.json + ../src/Vehicle/WindFact.json + ../src/Settings/Video.SettingsGroup.json + ../src/MissionManager/VTOLLandingPattern.FactMetaData.json + + + ../src/comm/APMArduSubMockLink.params + ../src/comm/PX4MockLink.params + + diff --git a/custom-example/res/CustomCameraControl.qml b/custom-example/res/CustomCameraControl.qml deleted file mode 100644 index d28d336c1..000000000 --- a/custom-example/res/CustomCameraControl.qml +++ /dev/null @@ -1,1029 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - * @file - * @author Gus Grubba - */ - -import QtQuick 2.11 -import QtQuick.Controls 2.4 -import QtQuick.Layouts 1.11 -import QtQuick.Dialogs 1.3 -import QtGraphicalEffects 1.0 - -import QtMultimedia 5.9 -import QtPositioning 5.2 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.FactControls 1.0 -import QGroundControl.FactSystem 1.0 -import QGroundControl.FlightMap 1.0 -import QGroundControl.Palette 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Vehicle 1.0 - -import CustomQuickInterface 1.0 -import Custom.Widgets 1.0 -import Custom.Camera 1.0 - -Item { - id: _root - height: mainColumn.height - width: mainColumn.width + (ScreenTools.defaultFontPixelWidth * 2) - visible: !QGroundControl.videoManager.fullScreen - - readonly property string _commLostStr: qsTr("NO CAMERA") - readonly property real buttonSize: ScreenTools.defaultFontPixelWidth * 5 - - property real _spacers: ScreenTools.defaultFontPixelHeight * 0.5 - property real _labelFieldWidth: ScreenTools.defaultFontPixelWidth * 28 - property real _editFieldWidth: ScreenTools.defaultFontPixelWidth * 30 - property real _editFieldHeight: ScreenTools.defaultFontPixelHeight * 2 - property var _videoManager: QGroundControl.videoManager - property bool _recordingLocalVideo: QGroundControl.videoManager.recording - - property var _dynamicCameras: activeVehicle ? activeVehicle.dynamicCameras : null - property bool _isCamera: _dynamicCameras ? _dynamicCameras.cameras.count > 0 : false - property int _curCameraIndex: _dynamicCameras ? _dynamicCameras.currentCamera : 0 - property var _camera: _isCamera ? _dynamicCameras.cameras.get(_curCameraIndex) : null - property bool _communicationLost: activeVehicle ? activeVehicle.connectionLost : false - property bool _noSdCard: _camera && _camera.storageTotal === 0 - property bool _fullSD: _camera && _camera.storageTotal !== 0 && _camera.storageFree > 0 && _camera.storageFree < 250 // We get kiB from the camera - property bool _cameraVideoMode: !_communicationLost && (_noSdCard ? false : _camera && _camera.cameraMode === QGCCameraControl.CAM_MODE_VIDEO) - property bool _cameraPhotoMode: !_communicationLost && (_noSdCard ? false : _camera && (_camera.cameraMode === QGCCameraControl.CAM_MODE_PHOTO || _camera.cameraMode === QGCCameraControl.CAM_MODE_SURVEY)) - property bool _cameraPhotoIdle: !_communicationLost && (_noSdCard ? false : _camera && _camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_IDLE) - property bool _cameraElapsedMode: !_communicationLost && (_noSdCard ? false : _camera && _camera.cameraMode === QGCCameraControl.CAM_MODE_PHOTO && _camera.photoMode === QGCCameraControl.PHOTO_CAPTURE_TIMELAPSE) - property bool _cameraModeUndefined: !_cameraPhotoMode && !_cameraVideoMode - property bool _recordingVideo: _cameraVideoMode && _camera.videoStatus === QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING - property bool _settingsEnabled: !_communicationLost && _camera && _camera.cameraMode !== QGCCameraControl.CAM_MODE_UNDEFINED && _camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_IDLE && !_recordingVideo - property bool _hasZoom: _camera && _camera.hasZoom - property Fact _irPaletteFact: _camera ? _camera.irPalette : null - property bool _isShortScreen: mainWindow.height / ScreenTools.realPixelDensity < 120 - property real _gimbalPitch: activeVehicle ? -activeVehicle.gimbalPitch : 0 - property real _gimbalYaw: activeVehicle ? activeVehicle.gimbalYaw : 0 - property bool _hasGimbal: activeVehicle && activeVehicle.gimbalData - Connections { - target: QGroundControl.multiVehicleManager.activeVehicle - onConnectionLostChanged: { - if(_communicationLost && cameraSettings.visible) { - cameraSettings.close() - } - } - } - - DeadMouseArea { - anchors.fill: parent - } - - //------------------------------------------------------------------------- - //-- Main Column - Column { - id: mainColumn - spacing: _spacers - anchors.centerIn: parent - //--------------------------------------------------------------------- - //-- Quick Thermal Modes - Item { - id: thermalBackgroundRect - width: buttonsRow.width + (ScreenTools.defaultFontPixelWidth * 4) - height: buttonsRow.height + (ScreenTools.defaultFontPixelHeight) - visible: QGroundControl.videoManager.hasThermal || _irPaletteFact || _camera.vendor === "NextVision" - anchors.horizontalCenter: parent.horizontalCenter - Component.onCompleted: { - if(_irPaletteFact && QGroundControl.videoManager.hasThermal) { - if(_camera.thermalMode === QGCCameraControl.THERMAL_OFF) - standardMode.checked = true - if(_camera.thermalMode === QGCCameraControl.THERMAL_PIP) - thermalPip.checked = true - if(_camera.thermalMode === QGCCameraControl.THERMAL_FULL) - thermalFull.checked = true - } - else - standardMode.checked = true - } - ButtonGroup { - id: buttonGroup - exclusive: true - buttons: buttonsRow.children - } - Row { - id: buttonsRow - spacing: ScreenTools.defaultFontPixelWidth * 0.5 - anchors.centerIn: parent - //-- Standard - CustomQuickButton { - id: standardMode - width: buttonSize - height: buttonSize - iconSource: "/custom/img/thermal-standard.svg" - onClicked: { - _camera.thermalMode = QGCCameraControl.THERMAL_OFF - } - } - //-- PIP - CustomQuickButton { - id: thermalPip - width: buttonSize - height: buttonSize - visible: _camera.vendor !== "NextVision" - iconSource: "/custom/img/thermal-pip.svg" - onClicked: { - _camera.thermalMode = QGCCameraControl.THERMAL_PIP - } - } - // Thermal - CustomQuickButton { - id: thermalFull - width: buttonSize - height: buttonSize - iconSource: "/custom/img/thermal-brightness.svg" - onClicked: { - _camera.thermalMode = QGCCameraControl.THERMAL_FULL - } - } - // Thermal palette options - CustomQuickButton { - checkable: false - width: buttonSize - height: buttonSize - visible: _irPaletteFact - iconSource: "/custom/img/thermal-palette.svg" - onClicked: { - thermalPalettes.open() - } - } - } - } - //--------------------------------------------------------------------- - //-- Main Camera Control - Row { - spacing: ScreenTools.defaultFontPixelWidth * 0.5 - anchors.horizontalCenter: parent.horizontalCenter - Rectangle { - id: cameraRect - height: cameraCol.height - width: cameraCol.width + (ScreenTools.defaultFontPixelWidth * 4) - color: qgcPal.window - radius: ScreenTools.defaultFontPixelWidth * 0.5 - Column { - id: cameraCol - spacing: _spacers - anchors.centerIn: parent - Item { - height: 1 - width: 1 - } - //----------------------------------------------------------------- - //-- Camera Name - QGCLabel { - text: activeVehicle ? (_camera && _camera.modelName !== "" ? _camera.modelName : _commLostStr) : _commLostStr - font.pointSize: ScreenTools.smallFontPointSize - anchors.horizontalCenter: parent.horizontalCenter - } - QGCLabel { - text: { - if(_noSdCard) return qsTr("NONE") - if(_fullSD) return qsTr("FULL") - return _camera ? _camera.storageFreeStr : "" - } - visible: _isShortScreen - color: (_noSdCard || _fullSD) ? qgcPal.colorOrange : qgcPal.text - font.pointSize: ScreenTools.smallFontPointSize - anchors.horizontalCenter: parent.horizontalCenter - } - //----------------------------------------------------------------- - //-- Camera Mode - Item { - width: modeCol.width - height: modeCol.height - anchors.horizontalCenter: parent.horizontalCenter - Column { - id: modeCol - spacing: _spacers - QGCColoredImage { - height: ScreenTools.defaultFontPixelHeight * 1.25 - width: height - source: (_cameraModeUndefined || _cameraPhotoMode) ? "/custom/img/camera_photo.svg" : "/custom/img/camera_video.svg" - color: qgcPal.text - fillMode: Image.PreserveAspectFit - sourceSize.height: height - anchors.horizontalCenter: parent.horizontalCenter - } - QGCLabel { - text: _cameraVideoMode ? qsTr("Video") : qsTr("Photo") - font.pointSize: ScreenTools.smallFontPointSize - anchors.horizontalCenter: parent.horizontalCenter - } - } - MouseArea { - anchors.fill: parent - enabled: !_cameraModeUndefined && _camera && _camera.videoStatus !== QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING && _cameraPhotoIdle - onClicked: { - _camera.toggleMode() - } - } - } - //----------------------------------------------------------------- - //-- Shutter - Rectangle { - color: Qt.rgba(0,0,0,0) - width: height - height: ScreenTools.defaultFontPixelHeight * 4 - radius: width * 0.5 - border.color: qgcPal.buttonText - border.width: 1 - anchors.horizontalCenter: parent.horizontalCenter - Rectangle { - width: parent.width * 0.85 - height: width - radius: width * 0.5 - color: _cameraModeUndefined ? qgcPal.colorGrey : ( _cameraVideoMode ? qgcPal.colorRed : qgcPal.text ) - visible: !pauseVideo.visible - anchors.centerIn: parent - QGCColoredImage { - id: busyIndicator - height: parent.height * 0.75 - width: height - source: "/qmlimages/MapSync.svg" - sourceSize.height: height - fillMode: Image.PreserveAspectFit - mipmap: true - smooth: true - color: qgcPal.window - visible: { - if(_cameraPhotoMode && !_cameraPhotoIdle && !_cameraElapsedMode) { - return true - } - return false - } - anchors.centerIn: parent - RotationAnimation on rotation { - loops: Animation.Infinite - from: 360 - to: 0 - duration: 740 - running: busyIndicator.visible - } - } - QGCLabel { - text: _camera ? _camera.photoLapse.toFixed(0) + 's' : qsTr('N/A') - font.family: ScreenTools.demiboldFontFamily - color: qgcPal.colorBlue - visible: _cameraElapsedMode - anchors.centerIn: parent - } - } - Rectangle { - id: pauseVideo - width: parent.width * 0.5 - height: width - color: _cameraModeUndefined ? qgcPal.colorGrey : qgcPal.colorRed - visible: { - if(_cameraVideoMode && _camera.videoStatus === QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING) { - return true - } - if(_cameraPhotoMode) { - if(_camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_INTERVAL_IDLE || _camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_INTERVAL_IN_PROGRESS) { - return true - } - } - return false - } - anchors.centerIn: parent - } - MouseArea { - anchors.fill: parent - enabled: !_noSdCard - onClicked: { - if(_cameraVideoMode) { - if(_camera.videoStatus === QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING) { - _camera.stopVideo() - //-- Local video as well - if (_recordingVideo) { - _videoManager.stopRecording() - } - } else { - if(!_fullSD) { - _camera.startVideo() - } - //-- Local video as well - if(_videoManager) { - _videoManager.startRecording() - } - } - } else { - if(_camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_INTERVAL_IDLE || _camera.photoStatus === QGCCameraControl.PHOTO_CAPTURE_INTERVAL_IN_PROGRESS) { - _camera.stopTakePhoto() - } else { - if(!_fullSD) { - _camera.takePhoto() - } - } - } - } - } - } - //----------------------------------------------------------------- - //-- Settings - Item { - width: settingsCol.width - height: settingsCol.height - anchors.horizontalCenter: parent.horizontalCenter - Column { - id: settingsCol - spacing: _spacers - anchors.horizontalCenter: parent.horizontalCenter - QGCColoredImage { - width: ScreenTools.defaultFontPixelHeight * 1.25 - height: width - sourceSize.width: width - source: "qrc:/custom/img/camera_settings.svg" - color: qgcPal.text - fillMode: Image.PreserveAspectFit - opacity: _settingsEnabled ? 1 : 0.5 - anchors.horizontalCenter: parent.horizontalCenter - } - QGCLabel { - text: qsTr("Settings") - font.pointSize: ScreenTools.smallFontPointSize - anchors.horizontalCenter: parent.horizontalCenter - } - } - MouseArea { - anchors.fill: parent - enabled: _settingsEnabled - onClicked: { - cameraSettings.open() - } - } - } - //----------------------------------------------------------------- - //-- microSD Card - Column { - spacing: _spacers - visible: !_isShortScreen - anchors.horizontalCenter: parent.horizontalCenter - QGCColoredImage { - width: ScreenTools.defaultFontPixelHeight * 1.25 - height: width - sourceSize.width: width - source: "qrc:/custom/img/microSD.svg" - color: qgcPal.text - fillMode: Image.PreserveAspectFit - opacity: _settingsEnabled ? 1 : 0.5 - anchors.horizontalCenter: parent.horizontalCenter - } - QGCLabel { - text: { - if(_noSdCard) return qsTr("NONE") - if(_fullSD) return qsTr("FULL") - return _camera ? _camera.storageFreeStr : "" - } - color: (_noSdCard || _fullSD) ? qgcPal.colorOrange : qgcPal.text - font.pointSize: ScreenTools.smallFontPointSize - anchors.horizontalCenter: parent.horizontalCenter - } - } - //----------------------------------------------------------------- - //-- Recording Time / Images Captured - QGCLabel { - text: (_cameraVideoMode && _camera.videoStatus === QGCCameraControl.VIDEO_CAPTURE_STATUS_RUNNING) ? _camera.recordTimeStr : "00:00:00" - visible: _cameraVideoMode - font.pointSize: ScreenTools.smallFontPointSize - anchors.horizontalCenter: parent.horizontalCenter - } - QGCLabel { - text: activeVehicle && _cameraPhotoMode ? ('00000' + activeVehicle.cameraTriggerPoints.count).slice(-5) : "00000" - visible: _cameraPhotoMode - font.pointSize: ScreenTools.smallFontPointSize - anchors.horizontalCenter: parent.horizontalCenter - } - Item { - height: 1 - width: 1 - } - } - } - //-- Gimbal Indicator - Rectangle { - id: gimbalBackground - width: _hasGimbal ? ScreenTools.defaultFontPixelWidth * 6 : 0 - height: _hasGimbal ? (gimbalCol.height + (ScreenTools.defaultFontPixelHeight * 2)) : 0 - visible: _hasGimbal - color: Qt.rgba(qgcPal.window.r, qgcPal.window.g, qgcPal.window.b, 0.75) - radius: ScreenTools.defaultFontPixelWidth * 0.5 - anchors.verticalCenter: cameraRect.verticalCenter - Column { - id: gimbalCol - spacing: ScreenTools.defaultFontPixelHeight * 0.75 - anchors.centerIn: parent - QGCColoredImage { - id: gimbalIcon - source: "/custom/img/gimbal_icon.svg" - color: qgcPal.text - width: ScreenTools.defaultFontPixelWidth * 2 - height: width - smooth: true - mipmap: true - antialiasing: true - fillMode: Image.PreserveAspectFit - sourceSize.width: width - anchors.horizontalCenter: parent.horizontalCenter - } - Image { - id: pitchScale - height: cameraRect.height * 0.65 - source: qgcPal.globalTheme === QGCPalette.Light ? "/custom/img/gimbal_pitch_indoors.svg" : "/custom/img/gimbal_pitch_outdoors.svg" - fillMode: Image.PreserveAspectFit - sourceSize.height: height - smooth: true - mipmap: true - antialiasing: true - - Image { - id: yawIndicator - width: ScreenTools.defaultFontPixelWidth * 4 - source: "/custom/img/gimbal_position.svg" - fillMode: Image.PreserveAspectFit - sourceSize.width: width - x: pitchScale.width/2 - y: (pitchScale.height * pitchScale.scaleRatio) + (pitchScale._pitch / pitchScale.rangeValue) * pitchScale.height - smooth: true - mipmap: true - transform: [ - Translate { - x: -yawIndicator.width / 2 - y: -yawIndicator.height / 2 - }, - Rotation { - angle: _gimbalYaw - } - ] - } - readonly property real minValue: -15 - readonly property real centerValue: 0 - readonly property real maxValue: 90 - readonly property real rangeValue: maxValue - minValue - readonly property real scaleRatio: 1/7 - property real _pitch: _gimbalPitch < minValue ? minValue : (_gimbalPitch > maxValue ? maxValue : _gimbalPitch) - } - QGCLabel { - id: gimbalLabel - width: gimbalCol.width - color: qgcPal.text - font.pointSize: ScreenTools.smallFontPointSize - text: activeVehicle ? activeVehicle.gimbalPitch.toFixed(0) : "-" - horizontalAlignment: Text.AlignHCenter - } - } - } // Gimbal Indicator - } - //-- Zoom Buttons - ZoomControl { - id: zoomControl - visible: _hasZoom - mainColor: qgcPal.window - contentColor: qgcPal.text - fontPointSize: ScreenTools.defaultFontPointSize * 1.75 - zoomLevelVisible: false - zoomLevel: _hasZoom ? _camera.zoomLevel : NaN - anchors.horizontalCenter: parent.horizontalCenter - onlyContinousZoom: true - onZoomIn: { - _camera.stepZoom(1) - } - onZoomOut: { - _camera.stepZoom(-1) - } - onContinuousZoomStart: { - _camera.startZoom(zoomIn ? 1 : -1) - } - onContinuousZoomStop: { - _camera.stopZoom() - } - } - } - //------------------------------------------------------------------------- - //-- Camera Settings - Popup { - id: cameraSettings - width: Math.min(mainWindow.width * 0.666, ScreenTools.defaultFontPixelWidth * 80) - height: mainWindow.height * 0.666 - modal: true - focus: true - parent: Overlay.overlay - x: Math.round((mainWindow.width - width) * 0.5) - y: Math.round((mainWindow.height - height) * 0.5) - closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside - background: Rectangle { - anchors.fill: parent - color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75) - border.color: qgcPal.text - radius: ScreenTools.defaultFontPixelWidth - } - Item { - anchors.fill: parent - anchors.margins: ScreenTools.defaultFontPixelHeight - function showEditFact(fact) { - factEditor.text = fact.valueString - factEdit.fact = fact - factEdit.visible = true - } - function hideEditFact() { - factEdit.visible = false - factEdit.fact = null - } - QGCLabel { - id: cameraSettingsLabel - text: _noSdCard ? qsTr("Settings") : (_cameraVideoMode ? qsTr("Video Settings") : qsTr("Photo Settings")) - font.family: ScreenTools.demiboldFontFamily - font.pointSize: ScreenTools.mediumFontPointSize - anchors.margins: ScreenTools.defaultFontPixelWidth - anchors.top: parent.top - anchors.left: parent.left - } - QGCFlickable { - clip: true - anchors.top: cameraSettingsLabel.bottom - anchors.bottom: parent.bottom - anchors.margins: ScreenTools.defaultFontPixelWidth - width: cameraSettingsCol.width + (ScreenTools.defaultFontPixelWidth * 2) - contentHeight: cameraSettingsCol.height - contentWidth: cameraSettingsCol.width - anchors.horizontalCenter: parent.horizontalCenter - Column { - id: cameraSettingsCol - spacing: _spacers - anchors.margins: ScreenTools.defaultFontPixelHeight - anchors.horizontalCenter: parent.horizontalCenter - //------------------------------------------- - //-- Camera Selector - Row { - spacing: ScreenTools.defaultFontPixelWidth - visible: _isCamera && _dynamicCameras.cameraLabels.length > 1 - anchors.horizontalCenter: parent.horizontalCenter - QGCLabel { - text: qsTr("Camera Selector:") - width: _labelFieldWidth - anchors.verticalCenter: parent.verticalCenter - } - QGCComboBox { - model: _isCamera ? _dynamicCameras.cameraLabels : [] - width: _editFieldWidth - height: _editFieldHeight - onActivated: _dynamicCameras.currentCamera = index - currentIndex: _dynamicCameras ? _dynamicCameras.currentCamera : 0 - } - } - Rectangle { - color: qgcPal.button - height: 1 - width: cameraSettingsCol.width - visible: _isCamera && _dynamicCameras.cameraLabels.length > 1 - } - //------------------------------------------- - //-- Stream Selector - Row { - spacing: ScreenTools.defaultFontPixelWidth - visible: _isCamera && _camera.streamLabels.length > 1 - anchors.horizontalCenter: parent.horizontalCenter - QGCLabel { - text: qsTr("Stream Selector:") - width: _labelFieldWidth - anchors.verticalCenter: parent.verticalCenter - } - QGCComboBox { - model: _camera ? _camera.streamLabels : [] - width: _editFieldWidth - height: _editFieldHeight - onActivated: _camera.currentStream = index - currentIndex: _camera ? _camera.currentStream : 0 - } - } - Rectangle { - color: qgcPal.button - height: 1 - width: cameraSettingsCol.width - visible: _isCamera && _camera.streamLabels.length > 1 - } - //------------------------------------------- - //-- Thermal Modes - Row { - spacing: ScreenTools.defaultFontPixelWidth - anchors.horizontalCenter: parent.horizontalCenter - visible: QGroundControl.videoManager.hasThermal - property var thermalModes: [qsTr("Off"), qsTr("Blend"), qsTr("Full"), qsTr("Picture In Picture")] - QGCLabel { - text: qsTr("Thermal View Mode") - width: _labelFieldWidth - anchors.verticalCenter: parent.verticalCenter - } - QGCComboBox { - width: _editFieldWidth - height: _editFieldHeight - model: parent.thermalModes - currentIndex: _camera ? _camera.thermalMode : 0 - onActivated: _camera.thermalMode = index - } - } - Rectangle { - color: qgcPal.button - height: 1 - width: cameraSettingsCol.width - visible: QGroundControl.videoManager.hasThermal - } - //------------------------------------------- - //-- Thermal Video Opacity - Row { - spacing: ScreenTools.defaultFontPixelWidth - anchors.horizontalCenter: parent.horizontalCenter - visible: QGroundControl.videoManager.hasThermal && _camera.thermalMode === QGCCameraControl.THERMAL_BLEND - QGCLabel { - text: qsTr("Blend Opacity") - width: _labelFieldWidth - anchors.verticalCenter: parent.verticalCenter - } - Slider { - width: _editFieldWidth - height: _editFieldHeight - to: 100 - from: 0 - value: _camera ? _camera.thermalOpacity : 0 - live: true - onValueChanged: { - _camera.thermalOpacity = value - } - } - } - Rectangle { - color: qgcPal.button - height: 1 - width: cameraSettingsCol.width - visible: QGroundControl.videoManager.hasThermal && _camera.thermalMode === QGCCameraControl.THERMAL_BLEND - } - //------------------------------------------- - //-- Settings from Camera Definition File - Repeater { - model: _camera ? _camera.activeSettings : [] - Item { - width: repCol.width - height: repCol.height - Column { - id: repCol - spacing: _spacers - property var _fact: _camera.getFact(modelData) - Row { - height: visible ? undefined : 0 - spacing: ScreenTools.defaultFontPixelWidth - anchors.horizontalCenter: parent.horizontalCenter - property bool _isBool: parent._fact.typeIsBool - property bool _isCombo: !_isBool && parent._fact.enumStrings.length > 0 - property bool _isSlider: parent._fact && !isNaN(parent._fact.increment) - property bool _isEdit: !_isBool && !_isSlider && parent._fact.enumStrings.length < 1 - QGCLabel { - text: parent.parent._fact.shortDescription - width: _labelFieldWidth - anchors.verticalCenter: parent.verticalCenter - } - FactComboBox { - width: parent._isCombo ? _editFieldWidth : 0 - height: parent._isCombo ? _editFieldHeight : 0 - fact: parent.parent._fact - indexModel: false - visible: parent._isCombo - anchors.verticalCenter: parent.verticalCenter - } - QGCButton { - visible: parent._isEdit - width: parent._isEdit ? _editFieldWidth : 0 - height: parent._isEdit ? _editFieldHeight : 0 - text: parent.parent._fact.valueString - onClicked: { - showEditFact(parent.parent._fact) - } - } - QGCSlider { - width: parent._isSlider ? _editFieldWidth : 0 - height: parent._isSlider ? _editFieldHeight : 0 - maximumValue: parent.parent._fact.max - minimumValue: parent.parent._fact.min - stepSize: parent.parent._fact.increment - visible: parent._isSlider - updateValueWhileDragging: false - anchors.verticalCenter: parent.verticalCenter - Component.onCompleted: { - value = parent.parent._fact.value - } - onValueChanged: { - parent.parent._fact.value = value - } - } - CustomOnOffSwitch { - width: parent._isBool ? _editFieldWidth : 0 - height: parent._isBool ? _editFieldHeight : 0 - checked: parent.parent._fact ? parent.parent._fact.value : false - onClicked: parent.parent._fact.value = checked ? 1 : 0 - visible: parent._isBool - anchors.verticalCenter: parent.verticalCenter - } - } - Rectangle { - color: qgcPal.button - height: 1 - width: cameraSettingsCol.width - } - } - } - } - //------------------------------------------- - //-- Time Lapse - Row { - spacing: ScreenTools.defaultFontPixelWidth - anchors.horizontalCenter: parent.horizontalCenter - visible: _cameraPhotoMode && !_noSdCard - property var photoModes: [qsTr("Single"), qsTr("Time Lapse")] - QGCLabel { - text: qsTr("Photo Mode") - width: _labelFieldWidth - anchors.verticalCenter: parent.verticalCenter - } - QGCComboBox { - width: _editFieldWidth - height: _editFieldHeight - model: parent.photoModes - currentIndex: _camera ? _camera.photoMode : 0 - onActivated: _camera.photoMode = index - } - } - Rectangle { - color: qgcPal.button - height: 1 - width: cameraSettingsCol.width - visible: _cameraPhotoMode && !_noSdCard - } - //------------------------------------------- - //-- Time Lapse Interval - Row { - spacing: ScreenTools.defaultFontPixelWidth - anchors.horizontalCenter: parent.horizontalCenter - visible: _cameraPhotoMode && _camera.photoMode === QGCCameraControl.PHOTO_CAPTURE_TIMELAPSE && !_noSdCard - QGCLabel { - text: qsTr("Photo Interval (seconds)") - width: _labelFieldWidth - anchors.verticalCenter: parent.verticalCenter - } - QGCSlider { - width: _editFieldWidth - height: _editFieldHeight - maximumValue: 60 - minimumValue: _camera ? (_camera.isE90 ? 3 : 5) : 5 - stepSize: 1 - value: _camera ? _camera.photoLapse : 5 - updateValueWhileDragging: true - anchors.verticalCenter: parent.verticalCenter - onValueChanged: { - if(_camera) { - _camera.photoLapse = value - } - } - } - } - Rectangle { - color: qgcPal.button - height: 1 - width: cameraSettingsCol.width - visible: _cameraPhotoMode && _camera.photoMode === QGCCameraControl.PHOTO_CAPTURE_TIMELAPSE && !_noSdCard - } - //------------------------------------------- - //-- Gimbal Control - Row { - spacing: ScreenTools.defaultFontPixelWidth - visible: _camera && !_camera.isThermal - anchors.horizontalCenter: parent.horizontalCenter - QGCLabel { - text: qsTr("Show Gimbal Control") - width: _labelFieldWidth - anchors.verticalCenter: parent.verticalCenter - } - CustomOnOffSwitch { - checked: CustomQuickInterface.showGimbalControl - width: _editFieldWidth - height: _editFieldHeight - anchors.verticalCenter: parent.verticalCenter - onClicked: CustomQuickInterface.showGimbalControl = checked - } - } - Rectangle { - color: qgcPal.button - height: 1 - width: cameraSettingsCol.width - visible: _camera && !_camera.isThermal - } - //------------------------------------------- - //-- Screen Grid - Row { - spacing: ScreenTools.defaultFontPixelWidth - visible: _camera && !_camera.isThermal - anchors.horizontalCenter: parent.horizontalCenter - QGCLabel { - text: qsTr("Screen Grid") - width: _labelFieldWidth - anchors.verticalCenter: parent.verticalCenter - } - CustomOnOffSwitch { - checked: QGroundControl.settingsManager.videoSettings.gridLines.rawValue - width: _editFieldWidth - height: _editFieldHeight - anchors.verticalCenter: parent.verticalCenter - onClicked: QGroundControl.settingsManager.videoSettings.gridLines.rawValue = checked - } - } - Rectangle { - color: qgcPal.button - height: 1 - width: cameraSettingsCol.width - visible: _camera && !_camera.isThermal - } - //------------------------------------------- - //-- Video Fit - Row { - spacing: ScreenTools.defaultFontPixelWidth - visible: _camera - anchors.horizontalCenter: parent.horizontalCenter - QGCLabel { - text: qsTr("Video Screen Fit") - width: _labelFieldWidth - anchors.verticalCenter: parent.verticalCenter - } - FactComboBox { - width: _editFieldWidth - height: _editFieldHeight - fact: QGroundControl.settingsManager.videoSettings.videoFit - indexModel: false - anchors.verticalCenter: parent.verticalCenter - } - } - Rectangle { - color: qgcPal.button - height: 1 - width: cameraSettingsCol.width - visible: _camera && !_camera.isThermal - } - //------------------------------------------- - //-- Reset Camera - Row { - spacing: ScreenTools.defaultFontPixelWidth - anchors.horizontalCenter: parent.horizontalCenter - QGCLabel { - text: qsTr("Reset Camera Defaults") - width: _labelFieldWidth - anchors.verticalCenter: parent.verticalCenter - } - QGCButton { - text: qsTr("Reset") - onClicked: resetPrompt.open() - width: _editFieldWidth - height: _editFieldHeight - enabled: !_recordingVideo - anchors.verticalCenter: parent.verticalCenter - MessageDialog { - id: resetPrompt - title: qsTr("Reset Camera to Factory Settings") - text: qsTr("Confirm resetting all settings?") - standardButtons: StandardButton.Yes | StandardButton.No - onNo: resetPrompt.close() - onYes: { - _camera.resetSettings() - QGroundControl.settingsManager.videoSettings.gridLines.rawValue = false - _camera.photoMode = QGCCameraControl.PHOTO_CAPTURE_SINGLE - _camera.photoLapse = 5.0 - _camera.photoLapseCount = 0 - resetPrompt.close() - } - } - } - } - Rectangle { - color: qgcPal.button - height: 1 - width: cameraSettingsCol.width - } - } - } - Rectangle { - id: factEdit - visible: false - color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.5) : Qt.rgba(0,0,0,0.5) - anchors.fill: parent - property var fact: null - DeadMouseArea { - anchors.fill: parent - } - Rectangle { - width: factEditCol.width * 1.25 - height: factEditCol.height * 1.25 - color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75) - border.width: 1 - border.color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(0,0,0,0.35) : Qt.rgba(1,1,1,0.35) - anchors.top: parent.top - anchors.topMargin: ScreenTools.defaultFontPixelHeight * 8 - anchors.horizontalCenter: parent.horizontalCenter - Column { - id: factEditCol - spacing: ScreenTools.defaultFontPixelHeight - anchors.centerIn: parent - QGCLabel { - text: factEdit.fact ? factEdit.fact.shortDescription : "" - anchors.horizontalCenter: parent.horizontalCenter - } - FactTextField { - id: factEditor - width: _editFieldWidth - fact: factEdit.fact - anchors.horizontalCenter: parent.horizontalCenter - } - QGCButton { - text: qsTr("Close") - anchors.horizontalCenter: parent.horizontalCenter - onClicked: { - factEditor.completeEditing() - hideEditFact() - } - } - } - } - } - } - } - //------------------------------------------------------------------------- - //-- Thermal Palettes - Popup { - id: thermalPalettes - width: Math.min(mainWindow.width * 0.666, ScreenTools.defaultFontPixelWidth * 40) - height: mainWindow.height * 0.5 - modal: true - focus: true - parent: Overlay.overlay - x: Math.round((mainWindow.width - width) * 0.5) - y: Math.round((mainWindow.height - height) * 0.5) - closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside - - background: Rectangle { - anchors.fill: parent - color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75) - border.color: qgcPal.text - radius: ScreenTools.defaultFontPixelWidth * 0.5 - } - Item { - anchors.fill: parent - anchors.margins: ScreenTools.defaultFontPixelHeight - QGCFlickable { - clip: true - anchors.fill: parent - width: comboListCol.width + (ScreenTools.defaultFontPixelWidth * 2) - contentHeight: comboListCol.height - contentWidth: comboListCol.width - anchors.horizontalCenter: parent.horizontalCenter - ColumnLayout { - id: comboListCol - spacing: ScreenTools.defaultFontPixelHeight - anchors.margins: ScreenTools.defaultFontPixelHeight - anchors.horizontalCenter: parent.horizontalCenter - QGCLabel { - text: qsTr("Thermal Palettes") - Layout.alignment: Qt.AlignHCenter - } - Repeater { - model: _irPaletteFact ? _irPaletteFact.enumStrings : [] - QGCButton { - text: modelData - Layout.minimumHeight: ScreenTools.defaultFontPixelHeight * 3 - Layout.minimumWidth: ScreenTools.defaultFontPixelWidth * 30 - Layout.fillHeight: true - Layout.fillWidth: true - Layout.alignment: Qt.AlignHCenter - checked: index === _irPaletteFact.value - onClicked: { - _irPaletteFact.value = index - if(thermalBackgroundRect.visible) { - if(_camera.thermalMode !== QGCCameraControl.THERMAL_PIP && _camera.thermalMode !== QGCCameraControl.THERMAL_FULL) { - _camera.thermalMode = QGCCameraControl.THERMAL_FULL - thermalFull.checked = true - } - } - - thermalPalettes.close() - } - } - } - } - } - } - } -} - diff --git a/custom-example/res/CustomFlyView.qml b/custom-example/res/CustomFlyView.qml deleted file mode 100644 index b03fdcc5a..000000000 --- a/custom-example/res/CustomFlyView.qml +++ /dev/null @@ -1,736 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - * @file - * @author Gus Grubba - */ - -import QtQuick 2.11 -import QtQuick.Controls 2.4 -import QtQuick.Layouts 1.11 -import QtQuick.Dialogs 1.3 -import QtPositioning 5.2 - -import QGroundControl 1.0 -import QGroundControl.Controllers 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.FlightMap 1.0 -import QGroundControl.MultiVehicleManager 1.0 -import QGroundControl.Palette 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Vehicle 1.0 -import QGroundControl.QGCPositionManager 1.0 -import QGroundControl.Airspace 1.0 - -import CustomQuickInterface 1.0 -import Custom.Widgets 1.0 - -Item { - anchors.fill: parent - visible: !QGroundControl.videoManager.fullScreen - - readonly property string scaleState: "topMode" - readonly property string noGPS: qsTr("NO GPS") - readonly property real indicatorValueWidth: ScreenTools.defaultFontPixelWidth * 7 - - property real _indicatorDiameter: ScreenTools.defaultFontPixelWidth * 18 - property real _indicatorsHeight: ScreenTools.defaultFontPixelHeight - property var _sepColor: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(0,0,0,0.5) : Qt.rgba(1,1,1,0.5) - property color _indicatorsColor: qgcPal.text - - property bool _communicationLost: activeVehicle ? activeVehicle.connectionLost : false - property bool _isVehicleGps: activeVehicle && activeVehicle.gps && activeVehicle.gps.count.rawValue > 1 && activeVehicle.gps.hdop.rawValue < 1.4 - property var _dynamicCameras: activeVehicle ? activeVehicle.dynamicCameras : null - property bool _isCamera: _dynamicCameras ? _dynamicCameras.cameras.count > 0 : false - property int _curCameraIndex: _dynamicCameras ? _dynamicCameras.currentCamera : 0 - property var _camera: _isCamera ? _dynamicCameras.cameras.get(_curCameraIndex) : null - property bool _cameraPresent: _camera && _camera.cameraMode !== QGCCameraControl.CAM_MODE_UNDEFINED - property var _flightPermit: QGroundControl.airmapSupported ? QGroundControl.airspaceManager.flightPlan.flightPermitStatus : null - property bool _hasGimbal: activeVehicle && activeVehicle.gimbalData - - property bool _airspaceIndicatorVisible: QGroundControl.airmapSupported && mainIsMap && _flightPermit && _flightPermit !== AirspaceFlightPlanProvider.PermitNone - - property string _altitude: activeVehicle ? (isNaN(activeVehicle.altitudeRelative.value) ? "0.0" : activeVehicle.altitudeRelative.value.toFixed(1)) + ' ' + activeVehicle.altitudeRelative.units : "0.0" - property string _distanceStr: isNaN(_distance) ? "0" : _distance.toFixed(0) + ' ' + (activeVehicle ? activeVehicle.altitudeRelative.units : "") - property real _heading: activeVehicle ? activeVehicle.heading.rawValue : 0 - - property real _distance: 0.0 - property string _messageTitle: "" - property string _messageText: "" - - function secondsToHHMMSS(timeS) { - var sec_num = parseInt(timeS, 10); - var hours = Math.floor(sec_num / 3600); - var minutes = Math.floor((sec_num - (hours * 3600)) / 60); - var seconds = sec_num - (hours * 3600) - (minutes * 60); - if (hours < 10) {hours = "0"+hours;} - if (minutes < 10) {minutes = "0"+minutes;} - if (seconds < 10) {seconds = "0"+seconds;} - return hours+':'+minutes+':'+seconds; - } - - Timer { - id: connectionTimer - interval: 5000 - running: false; - repeat: false; - onTriggered: { - //-- Vehicle is gone - if(activeVehicle) { - //-- Let video stream close - QGroundControl.settingsManager.videoSettings.rtspTimeout.rawValue = 1 - if(!activeVehicle.armed) { - //-- If it wasn't already set to auto-disconnect - if(!activeVehicle.autoDisconnect) { - //-- Vehicle is not armed. Close connection and tell user. - activeVehicle.disconnectInactiveVehicle() - connectionLostDisarmedDialog.open() - } - } else { - //-- Vehicle is armed. Show doom dialog. - connectionLostArmed.open() - } - } - } - } - - Connections { - target: QGroundControl.qgcPositionManger - onGcsPositionChanged: { - if (activeVehicle && gcsPosition.latitude && Math.abs(gcsPosition.latitude) > 0.001 && gcsPosition.longitude && Math.abs(gcsPosition.longitude) > 0.001) { - var gcs = QtPositioning.coordinate(gcsPosition.latitude, gcsPosition.longitude) - var veh = activeVehicle.coordinate; - _distance = QGroundControl.metersToAppSettingsDistanceUnits(gcs.distanceTo(veh)); - //-- Ignore absurd values - if(_distance > 99999) - _distance = 0; - if(_distance < 0) - _distance = 0; - } else { - _distance = 0; - } - } - } - - Connections { - target: QGroundControl.multiVehicleManager.activeVehicle - onConnectionLostChanged: { - if(!_communicationLost) { - //-- Communication regained - connectionTimer.stop(); - if(connectionLostArmed.visible) { - connectionLostArmed.close() - } - //-- Reset stream timeout - QGroundControl.settingsManager.videoSettings.rtspTimeout.rawValue = 60 - } else { - if(activeVehicle && !activeVehicle.autoDisconnect) { - //-- Communication lost - connectionTimer.start(); - } - } - } - } - - Connections { - target: QGroundControl.multiVehicleManager - onVehicleAdded: { - //-- Dismiss comm lost dialog if open - connectionLostDisarmedDialog.close() - } - } - //------------------------------------------------------------------------- - MessageDialog { - id: connectionLostDisarmedDialog - title: qsTr("Communication Lost") - text: qsTr("Connection to vehicle has been lost and closed.") - standardButtons: StandardButton.Ok - onAccepted: { - connectionLostDisarmedDialog.close() - } - } - //------------------------------------------------------------------------- - //-- Heading Indicator - Rectangle { - id: compassBar - height: ScreenTools.defaultFontPixelHeight * 1.5 - width: ScreenTools.defaultFontPixelWidth * 50 - color: "#DEDEDE" - radius: 2 - clip: true - anchors.top: parent.top - anchors.topMargin: ScreenTools.defaultFontPixelHeight * (_airspaceIndicatorVisible ? 3 : 1) - anchors.horizontalCenter: parent.horizontalCenter - visible: !mainIsMap - Repeater { - model: 720 - visible: !mainIsMap - QGCLabel { - function _normalize(degrees) { - var a = degrees % 360 - if (a < 0) a += 360 - return a - } - property int _startAngle: modelData + 180 + _heading - property int _angle: _normalize(_startAngle) - anchors.verticalCenter: parent.verticalCenter - x: visible ? ((modelData * (compassBar.width / 360)) - (width * 0.5)) : 0 - visible: _angle % 45 == 0 - color: "#75505565" - font.pointSize: ScreenTools.smallFontPointSize - text: { - switch(_angle) { - case 0: return "N" - case 45: return "NE" - case 90: return "E" - case 135: return "SE" - case 180: return "S" - case 225: return "SW" - case 270: return "W" - case 315: return "NW" - } - return "" - } - } - } - } - Rectangle { - id: headingIndicator - height: ScreenTools.defaultFontPixelHeight - width: ScreenTools.defaultFontPixelWidth * 4 - color: qgcPal.windowShadeDark - visible: !mainIsMap - anchors.bottom: compassBar.top - anchors.bottomMargin: ScreenTools.defaultFontPixelHeight * -0.1 - anchors.horizontalCenter: parent.horizontalCenter - QGCLabel { - text: _heading - color: qgcPal.text - font.pointSize: ScreenTools.smallFontPointSize - anchors.centerIn: parent - } - } - Image { - height: _indicatorsHeight - width: height - source: "/custom/img/compass_pointer.svg" - visible: !mainIsMap - fillMode: Image.PreserveAspectFit - sourceSize.height: height - anchors.top: compassBar.bottom - anchors.topMargin: ScreenTools.defaultFontPixelHeight * -0.5 - anchors.horizontalCenter: parent.horizontalCenter - } - //------------------------------------------------------------------------- - //-- Camera Control - Loader { - id: camControlLoader - visible: !mainIsMap && _cameraPresent && _camera.paramComplete - source: visible ? "/custom/CustomCameraControl.qml" : "" - anchors.right: parent.right - anchors.rightMargin: ScreenTools.defaultFontPixelWidth - anchors.top: parent.top - anchors.topMargin: ScreenTools.defaultFontPixelHeight - } - //------------------------------------------------------------------------- - //-- Map Scale - MapScale { - id: mapScale - anchors.left: parent.left - anchors.top: parent.top - anchors.topMargin: ScreenTools.defaultFontPixelHeight * 0.5 - anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 16 - mapControl: mainWindow.flightDisplayMap - visible: rootBackground.visible && mainIsMap - } - //------------------------------------------------------------------------- - //-- Vehicle Indicator - Rectangle { - id: vehicleIndicator - color: qgcPal.window - width: vehicleStatusGrid.width + (ScreenTools.defaultFontPixelWidth * 3) - height: vehicleStatusGrid.height + (ScreenTools.defaultFontPixelHeight * 1.5) - radius: 2 - anchors.bottom: parent.bottom - anchors.bottomMargin: ScreenTools.defaultFontPixelWidth - anchors.right: attitudeIndicator.visible ? attitudeIndicator.left : parent.right - anchors.rightMargin: attitudeIndicator.visible ? -ScreenTools.defaultFontPixelWidth : ScreenTools.defaultFontPixelWidth - - readonly property bool _showGps: CustomQuickInterface.showAttitudeWidget - - - GridLayout { - id: vehicleStatusGrid - columnSpacing: ScreenTools.defaultFontPixelWidth * 1.5 - rowSpacing: ScreenTools.defaultFontPixelHeight * 0.5 - columns: 7 - anchors.centerIn: parent - - //-- Latitude - QGCLabel { - height: _indicatorsHeight - width: height - Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter - color: qgcPal.text - text: "Lat:" - visible: vehicleIndicator._showGps - } - QGCLabel { - id: firstLabel - text: activeVehicle ? activeVehicle.gps.lat.value.toFixed(activeVehicle.gps.lat.decimalPlaces) : "-" - color: _indicatorsColor - font.pointSize: ScreenTools.smallFontPointSize - Layout.fillWidth: true - Layout.minimumWidth: indicatorValueWidth - horizontalAlignment: Text.AlignLeft - visible: vehicleIndicator._showGps - } - //-- Longitude - QGCLabel { - height: _indicatorsHeight - width: height - Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter - color: qgcPal.text - text: "Lon:" - visible: vehicleIndicator._showGps - } - QGCLabel { - text: activeVehicle ? activeVehicle.gps.lon.value.toFixed(activeVehicle.gps.lon.decimalPlaces) : "-" - color: _indicatorsColor - font.pointSize: ScreenTools.smallFontPointSize - Layout.fillWidth: true - Layout.minimumWidth: indicatorValueWidth - horizontalAlignment: firstLabel.horizontalAlignment - visible: vehicleIndicator._showGps - } - //-- HDOP - QGCLabel { - height: _indicatorsHeight - width: height - Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter - color: qgcPal.text - text: "HDOP:" - visible: vehicleIndicator._showGps - } - QGCLabel { - text: activeVehicle ? activeVehicle.gps.hdop.value.toFixed(activeVehicle.gps.hdop.decimalPlaces) : "-" - color: _indicatorsColor - font.pointSize: ScreenTools.smallFontPointSize - Layout.fillWidth: true - Layout.minimumWidth: indicatorValueWidth - horizontalAlignment: firstLabel.horizontalAlignment - visible: vehicleIndicator._showGps - } - - //-- Compass - Item { - Layout.rowSpan: 3 - Layout.column: 6 - Layout.minimumWidth: mainIsMap ? parent.height * 1.25 : 0 - Layout.fillHeight: true - Layout.fillWidth: true - //-- Large circle - Rectangle { - height: mainIsMap ? parent.height : 0 - width: mainIsMap ? height : 0 - radius: height * 0.5 - border.color: qgcPal.text - border.width: 1 - color: Qt.rgba(0,0,0,0) - anchors.centerIn: parent - visible: mainIsMap - } - //-- North Label - Rectangle { - height: mainIsMap ? ScreenTools.defaultFontPixelHeight * 0.75 : 0 - width: mainIsMap ? ScreenTools.defaultFontPixelWidth * 2 : 0 - radius: ScreenTools.defaultFontPixelWidth * 0.25 - color: qgcPal.windowShade - visible: mainIsMap - anchors.top: parent.top - anchors.topMargin: ScreenTools.defaultFontPixelHeight * -0.25 - anchors.horizontalCenter: parent.horizontalCenter - QGCLabel { - text: "N" - color: qgcPal.text - font.pointSize: ScreenTools.smallFontPointSize - anchors.centerIn: parent - } - } - //-- Needle - Image { - id: compassNeedle - anchors.centerIn: parent - height: mainIsMap ? parent.height * 0.75 : 0 - width: height - source: "/custom/img/compass_needle.svg" - fillMode: Image.PreserveAspectFit - visible: mainIsMap - sourceSize.height: height - transform: [ - Rotation { - origin.x: compassNeedle.width / 2 - origin.y: compassNeedle.height / 2 - angle: _heading - }] - } - //-- Heading - Rectangle { - height: mainIsMap ? ScreenTools.defaultFontPixelHeight * 0.75 : 0 - width: mainIsMap ? ScreenTools.defaultFontPixelWidth * 3.5 : 0 - radius: ScreenTools.defaultFontPixelWidth * 0.25 - color: qgcPal.windowShade - visible: mainIsMap - anchors.bottom: parent.bottom - anchors.bottomMargin: ScreenTools.defaultFontPixelHeight * -0.25 - anchors.horizontalCenter: parent.horizontalCenter - QGCLabel { - text: _heading - color: qgcPal.text - font.pointSize: ScreenTools.smallFontPointSize - anchors.centerIn: parent - } - } - } - //-- Second Row - //-- Chronometer - QGCColoredImage { - height: _indicatorsHeight - width: height - source: "/custom/img/chronometer.svg" - fillMode: Image.PreserveAspectFit - sourceSize.height: height - Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter - color: qgcPal.text - } - QGCLabel { - text: { - if(activeVehicle) - return secondsToHHMMSS(activeVehicle.getFact("flightTime").value) - return "00:00:00" - } - color: _indicatorsColor - font.pointSize: ScreenTools.smallFontPointSize - Layout.fillWidth: true - Layout.minimumWidth: indicatorValueWidth - horizontalAlignment: firstLabel.horizontalAlignment - } - //-- Ground Speed - QGCColoredImage { - height: _indicatorsHeight - width: height - source: "/custom/img/horizontal_speed.svg" - fillMode: Image.PreserveAspectFit - sourceSize.height: height - Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter - color: qgcPal.text - } - QGCLabel { - text: activeVehicle ? activeVehicle.groundSpeed.value.toFixed(1) + ' ' + activeVehicle.groundSpeed.units : "0.0" - color: _indicatorsColor - font.pointSize: ScreenTools.smallFontPointSize - Layout.fillWidth: true - Layout.minimumWidth: indicatorValueWidth - horizontalAlignment: firstLabel.horizontalAlignment - } - //-- Vertical Speed - QGCColoredImage { - height: _indicatorsHeight - width: height - source: "/custom/img/vertical_speed.svg" - fillMode: Image.PreserveAspectFit - sourceSize.height: height - Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter - color: qgcPal.text - - } - QGCLabel { - text: activeVehicle ? activeVehicle.climbRate.value.toFixed(1) + ' ' + activeVehicle.climbRate.units : "0.0" - color: _indicatorsColor - font.pointSize: ScreenTools.smallFontPointSize - Layout.fillWidth: true - Layout.minimumWidth: indicatorValueWidth - horizontalAlignment: firstLabel.horizontalAlignment - } - //-- Third Row - //-- Odometer - QGCColoredImage { - height: _indicatorsHeight - width: height - source: "/custom/img/odometer.svg" - fillMode: Image.PreserveAspectFit - sourceSize.height: height - Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter - color: qgcPal.text - - } - QGCLabel { - text: activeVehicle ? ('00000' + activeVehicle.flightDistance.value.toFixed(0)).slice(-5) + ' ' + activeVehicle.flightDistance.units : "00000" - color: _indicatorsColor - font.pointSize: ScreenTools.smallFontPointSize - Layout.fillWidth: true - Layout.minimumWidth: indicatorValueWidth - horizontalAlignment: firstLabel.horizontalAlignment - } - //-- Altitude - QGCColoredImage { - height: _indicatorsHeight - width: height - source: "/custom/img/altitude.svg" - fillMode: Image.PreserveAspectFit - sourceSize.height: height - Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter - color: qgcPal.text - - } - QGCLabel { - text: _altitude - color: _indicatorsColor - font.pointSize: ScreenTools.smallFontPointSize - Layout.fillWidth: true - Layout.minimumWidth: indicatorValueWidth - horizontalAlignment: firstLabel.horizontalAlignment - } - //-- Distance - QGCColoredImage { - height: _indicatorsHeight - width: height - source: "/custom/img/distance.svg" - fillMode: Image.PreserveAspectFit - sourceSize.height: height - Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter - color: qgcPal.text - - } - QGCLabel { - text: _distance ? _distanceStr : noGPS - color: _distance ? _indicatorsColor : qgcPal.colorOrange - font.pointSize: ScreenTools.smallFontPointSize - Layout.fillWidth: true - Layout.minimumWidth: indicatorValueWidth - horizontalAlignment: firstLabel.horizontalAlignment - } - } - MouseArea { - anchors.fill: parent - onDoubleClicked: CustomQuickInterface.showAttitudeWidget = !CustomQuickInterface.showAttitudeWidget - } - } - //------------------------------------------------------------------------- - //-- Attitude Indicator - Rectangle { - color: qgcPal.window - width: attitudeIndicator.width * 0.5 - height: vehicleIndicator.height - visible: CustomQuickInterface.showAttitudeWidget - anchors.top: vehicleIndicator.top - anchors.left: vehicleIndicator.right - } - Rectangle { - id: attitudeIndicator - anchors.bottom: vehicleIndicator.bottom - anchors.bottomMargin: ScreenTools.defaultFontPixelWidth * -0.5 - anchors.right: parent.right - anchors.rightMargin: ScreenTools.defaultFontPixelWidth - height: ScreenTools.defaultFontPixelHeight * 6 - width: height - radius: height * 0.5 - color: qgcPal.windowShade - visible: CustomQuickInterface.showAttitudeWidget - CustomAttitudeWidget { - size: parent.height * 0.95 - vehicle: activeVehicle - showHeading: false - anchors.centerIn: parent - } - } - //------------------------------------------------------------------------- - //-- Multi Vehicle Selector - Row { - id: multiVehicleSelector - spacing: ScreenTools.defaultFontPixelWidth - anchors.bottom: parent.bottom - anchors.bottomMargin: ScreenTools.defaultFontPixelWidth * 1.5 - anchors.right: vehicleIndicator.left - anchors.rightMargin: ScreenTools.defaultFontPixelWidth - visible: QGroundControl.multiVehicleManager.vehicles.count > 1 - Repeater { - model: QGroundControl.multiVehicleManager.vehicles.count - CustomVehicleButton { - property var _vehicle: QGroundControl.multiVehicleManager.vehicles.get(modelData) - vehicle: _vehicle - checked: (_vehicle && activeVehicle) ? _vehicle.id === activeVehicle.id : false - onClicked: { - QGroundControl.multiVehicleManager.activeVehicle = _vehicle - } - } - } - } - //------------------------------------------------------------------------- - //-- Gimbal Control - Rectangle { - id: gimbalControl - visible: camControlLoader.visible && CustomQuickInterface.showGimbalControl && _hasGimbal - anchors.bottom: camControlLoader.bottom - anchors.right: camControlLoader.left - anchors.rightMargin: ScreenTools.defaultFontPixelWidth * (QGroundControl.videoManager.hasThermal ? -1 : 1) - height: parent.width * 0.125 - width: height - color: Qt.rgba(1,1,1,0.25) - radius: width * 0.5 - - property real _currentPitch: 0 - property real _currentYaw: 0 - property real time_last_seconds:0 - property real _lastHackedYaw: 0 - property real speedMultiplier: 5 - - property real maxRate: 20 - property real exponentialFactor:0.6 - property real kPFactor: 3 - - property real reportedYawDeg: activeVehicle ? activeVehicle.gimbalYaw : NaN - property real reportedPitchDeg: activeVehicle ? activeVehicle.gimbalPitch : NaN - - Timer { - interval: 100 //-- 10Hz - running: gimbalControl.visible && activeVehicle - repeat: true - onTriggered: { - if (activeVehicle) { - var yaw = gimbalControl._currentYaw - var oldYaw = yaw; - var pitch = gimbalControl._currentPitch - var oldPitch = pitch; - var pitch_stick = (stick.yAxis * 2.0 - 1.0) - if(_camera && _camera.vendor === "NextVision") { - var time_current_seconds = ((new Date()).getTime())/1000.0 - if(gimbalControl.time_last_seconds === 0.0) - gimbalControl.time_last_seconds = time_current_seconds - var pitch_angle = gimbalControl._currentPitch - // Preparing stick input with exponential curve and maximum rate - var pitch_expo = (1 - gimbalControl.exponentialFactor) * pitch_stick + gimbalControl.exponentialFactor * pitch_stick * pitch_stick * pitch_stick - var pitch_rate = pitch_stick * gimbalControl.maxRate - var pitch_angle_reported = gimbalControl.reportedPitchDeg - // Integrate the angular rate to an angle time abstracted - pitch_angle += pitch_rate * (time_current_seconds - gimbalControl.time_last_seconds) - // Control the angle quicker by driving the gimbal internal angle controller into saturation - var pitch_angle_error = pitch_angle - pitch_angle_reported - pitch_angle_error = Math.round(pitch_angle_error) - var pitch_setpoint = pitch_angle + pitch_angle_error * gimbalControl.kPFactor - //console.info("error: " + pitch_angle_error + "; angle_state: " + pitch_angle) - pitch = pitch_setpoint - yaw += stick.xAxis * gimbalControl.speedMultiplier - - yaw = clamp(yaw, -180, 180) - pitch = clamp(pitch, -90, 45) - pitch_angle = clamp(pitch_angle, -90, 45) - - //console.info("P: " + pitch + "; Y: " + yaw) - activeVehicle.gimbalControlValue(pitch, yaw); - gimbalControl._currentYaw = yaw - gimbalControl._currentPitch = pitch_angle - gimbalControl.time_last_seconds = time_current_seconds - } else { - yaw += stick.xAxis * gimbalControl.speedMultiplier - var hackedYaw = yaw + (stick.xAxis * gimbalControl.speedMultiplier * 50) - pitch += pitch_stick * gimbalControl.speedMultiplier - hackedYaw = clamp(hackedYaw, -180, 180) - yaw = clamp(yaw, -180, 180) - pitch = clamp(pitch, -90, 90) - if(gimbalControl._lastHackedYaw !== hackedYaw || gimbalControl.hackedYaw !== oldYaw || pitch !== oldPitch) { - activeVehicle.gimbalControlValue(pitch, hackedYaw) - gimbalControl._lastHackedYaw = hackedYaw - gimbalControl._currentPitch = pitch - gimbalControl._currentYaw = yaw - } - } - } - } - function clamp(num, min, max) { - return Math.min(Math.max(num, min), max); - } - } - JoystickThumbPad { - id: stick - anchors.fill: parent - lightColors: qgcPal.globalTheme === QGCPalette.Light - yAxisThrottle: true - yAxisThrottleCentered: true - xAxis: 0 - yAxis: 0.5 - } - } - //------------------------------------------------------------------------- - //-- Object Avoidance - Item { - visible: activeVehicle && activeVehicle.objectAvoidance.available && activeVehicle.objectAvoidance.enabled - anchors.centerIn: parent - width: parent.width * 0.5 - height: parent.height * 0.5 - Repeater { - model: activeVehicle && activeVehicle.objectAvoidance.gridSize > 0 ? activeVehicle.objectAvoidance.gridSize : [] - Rectangle { - width: ScreenTools.defaultFontPixelWidth - height: width - radius: width * 0.5 - color: distance < 0.25 ? "red" : "orange" - x: (parent.width * activeVehicle.objectAvoidance.grid(modelData).x) + (parent.width * 0.5) - y: (parent.height * activeVehicle.objectAvoidance.grid(modelData).y) + (parent.height * 0.5) - property real distance: activeVehicle.objectAvoidance.distance(modelData) - } - } - } - //------------------------------------------------------------------------- - //-- Connection Lost While Armed - Popup { - id: connectionLostArmed - width: mainWindow.width * 0.666 - height: connectionLostArmedCol.height * 1.5 - modal: true - focus: true - parent: Overlay.overlay - x: Math.round((mainWindow.width - width) * 0.5) - y: Math.round((mainWindow.height - height) * 0.5) - closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside - background: Rectangle { - anchors.fill: parent - color: qgcPal.alertBackground - border.color: qgcPal.alertBorder - radius: ScreenTools.defaultFontPixelWidth - } - Column { - id: connectionLostArmedCol - spacing: ScreenTools.defaultFontPixelHeight * 3 - anchors.margins: ScreenTools.defaultFontPixelHeight - anchors.centerIn: parent - QGCLabel { - text: qsTr("Communication Lost") - font.family: ScreenTools.demiboldFontFamily - font.pointSize: ScreenTools.largeFontPointSize - color: qgcPal.alertText - anchors.horizontalCenter: parent.horizontalCenter - } - QGCLabel { - text: qsTr("Warning: Connection to vehicle lost.") - color: qgcPal.alertText - font.family: ScreenTools.demiboldFontFamily - font.pointSize: ScreenTools.mediumFontPointSize - anchors.horizontalCenter: parent.horizontalCenter - } - QGCLabel { - text: qsTr("The vehicle will automatically cancel the flight and return to land. Ensure a clear line of sight between transmitter and vehicle. Ensure the takeoff location is clear.") - width: connectionLostArmed.width * 0.75 - wrapMode: Text.WordWrap - color: qgcPal.alertText - font.family: ScreenTools.demiboldFontFamily - font.pointSize: ScreenTools.mediumFontPointSize - anchors.horizontalCenter: parent.horizontalCenter - } - } - } -} diff --git a/custom-example/res/CustomFlyViewOverlay.qml b/custom-example/res/CustomFlyViewOverlay.qml new file mode 100644 index 000000000..ebae0ba3b --- /dev/null +++ b/custom-example/res/CustomFlyViewOverlay.qml @@ -0,0 +1,390 @@ +/**************************************************************************** + * + * (c) 2009-2019 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + * @file + * @author Gus Grubba + */ + +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQuick.Layouts 1.11 +import QtQuick.Dialogs 1.3 +import QtPositioning 5.2 + +import QGroundControl 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.FlightMap 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.Vehicle 1.0 +import QGroundControl.QGCPositionManager 1.0 + +import Custom.Widgets 1.0 + +Item { + anchors.fill: parent + visible: !QGroundControl.videoManager.fullScreen + + readonly property string scaleState: "topMode" + readonly property string noGPS: qsTr("NO GPS") + readonly property real indicatorValueWidth: ScreenTools.defaultFontPixelWidth * 7 + + property real _indicatorDiameter: ScreenTools.defaultFontPixelWidth * 18 + property real _indicatorsHeight: ScreenTools.defaultFontPixelHeight + property var _sepColor: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(0,0,0,0.5) : Qt.rgba(1,1,1,0.5) + property color _indicatorsColor: qgcPal.text + + property bool _isVehicleGps: activeVehicle && activeVehicle.gps && activeVehicle.gps.count.rawValue > 1 && activeVehicle.gps.hdop.rawValue < 1.4 + + property string _altitude: activeVehicle ? (isNaN(activeVehicle.altitudeRelative.value) ? "0.0" : activeVehicle.altitudeRelative.value.toFixed(1)) + ' ' + activeVehicle.altitudeRelative.units : "0.0" + property string _distanceStr: isNaN(_distance) ? "0" : _distance.toFixed(0) + ' ' + (activeVehicle ? activeVehicle.altitudeRelative.units : "") + property real _heading: activeVehicle ? activeVehicle.heading.rawValue : 0 + + property real _distance: 0.0 + property string _messageTitle: "" + property string _messageText: "" + + function secondsToHHMMSS(timeS) { + var sec_num = parseInt(timeS, 10); + var hours = Math.floor(sec_num / 3600); + var minutes = Math.floor((sec_num - (hours * 3600)) / 60); + var seconds = sec_num - (hours * 3600) - (minutes * 60); + if (hours < 10) {hours = "0"+hours;} + if (minutes < 10) {minutes = "0"+minutes;} + if (seconds < 10) {seconds = "0"+seconds;} + return hours+':'+minutes+':'+seconds; + } + + // FIXE: Isn't distance to home in factgroup + Connections { + target: QGroundControl.qgcPositionManger + onGcsPositionChanged: { + if (activeVehicle && gcsPosition.latitude && Math.abs(gcsPosition.latitude) > 0.001 && gcsPosition.longitude && Math.abs(gcsPosition.longitude) > 0.001) { + var gcs = QtPositioning.coordinate(gcsPosition.latitude, gcsPosition.longitude) + var veh = activeVehicle.coordinate; + _distance = QGroundControl.metersToAppSettingsDistanceUnits(gcs.distanceTo(veh)); + //-- Ignore absurd values + if(_distance > 99999) + _distance = 0; + if(_distance < 0) + _distance = 0; + } else { + _distance = 0; + } + } + } + + //------------------------------------------------------------------------- + //-- Heading Indicator + Rectangle { + id: compassBar + height: ScreenTools.defaultFontPixelHeight * 1.5 + width: ScreenTools.defaultFontPixelWidth * 50 + color: "#DEDEDE" + radius: 2 + clip: true + anchors.top: parent.top + anchors.topMargin: ScreenTools.defaultFontPixelHeight + anchors.horizontalCenter: parent.horizontalCenter + visible: !mainIsMap + Repeater { + model: 720 + visible: !mainIsMap + QGCLabel { + function _normalize(degrees) { + var a = degrees % 360 + if (a < 0) a += 360 + return a + } + property int _startAngle: modelData + 180 + _heading + property int _angle: _normalize(_startAngle) + anchors.verticalCenter: parent.verticalCenter + x: visible ? ((modelData * (compassBar.width / 360)) - (width * 0.5)) : 0 + visible: _angle % 45 == 0 + color: "#75505565" + font.pointSize: ScreenTools.smallFontPointSize + text: { + switch(_angle) { + case 0: return "N" + case 45: return "NE" + case 90: return "E" + case 135: return "SE" + case 180: return "S" + case 225: return "SW" + case 270: return "W" + case 315: return "NW" + } + return "" + } + } + } + } + Rectangle { + id: headingIndicator + height: ScreenTools.defaultFontPixelHeight + width: ScreenTools.defaultFontPixelWidth * 4 + color: qgcPal.windowShadeDark + visible: !mainIsMap + anchors.bottom: compassBar.top + anchors.bottomMargin: ScreenTools.defaultFontPixelHeight * -0.1 + anchors.horizontalCenter: parent.horizontalCenter + QGCLabel { + text: _heading + color: qgcPal.text + font.pointSize: ScreenTools.smallFontPointSize + anchors.centerIn: parent + } + } + Image { + height: _indicatorsHeight + width: height + source: "/custom/img/compass_pointer.svg" + visible: !mainIsMap + fillMode: Image.PreserveAspectFit + sourceSize.height: height + anchors.top: compassBar.bottom + anchors.topMargin: ScreenTools.defaultFontPixelHeight * -0.5 + anchors.horizontalCenter: parent.horizontalCenter + } + //------------------------------------------------------------------------- + //-- Vehicle Indicator + Rectangle { + id: vehicleIndicator + color: qgcPal.window + width: vehicleStatusGrid.width + (ScreenTools.defaultFontPixelWidth * 3) + height: vehicleStatusGrid.height + (ScreenTools.defaultFontPixelHeight * 1.5) + radius: 2 + anchors.bottom: parent.bottom + anchors.bottomMargin: ScreenTools.defaultFontPixelWidth + anchors.right: attitudeIndicator.visible ? attitudeIndicator.left : parent.right + anchors.rightMargin: attitudeIndicator.visible ? -ScreenTools.defaultFontPixelWidth : ScreenTools.defaultFontPixelWidth + + GridLayout { + id: vehicleStatusGrid + columnSpacing: ScreenTools.defaultFontPixelWidth * 1.5 + rowSpacing: ScreenTools.defaultFontPixelHeight * 0.5 + columns: 7 + anchors.centerIn: parent + + //-- Compass + Item { + Layout.rowSpan: 3 + Layout.column: 6 + Layout.minimumWidth: mainIsMap ? parent.height * 1.25 : 0 + Layout.fillHeight: true + Layout.fillWidth: true + //-- Large circle + Rectangle { + height: mainIsMap ? parent.height : 0 + width: mainIsMap ? height : 0 + radius: height * 0.5 + border.color: qgcPal.text + border.width: 1 + color: Qt.rgba(0,0,0,0) + anchors.centerIn: parent + visible: mainIsMap + } + //-- North Label + Rectangle { + height: mainIsMap ? ScreenTools.defaultFontPixelHeight * 0.75 : 0 + width: mainIsMap ? ScreenTools.defaultFontPixelWidth * 2 : 0 + radius: ScreenTools.defaultFontPixelWidth * 0.25 + color: qgcPal.windowShade + visible: mainIsMap + anchors.top: parent.top + anchors.topMargin: ScreenTools.defaultFontPixelHeight * -0.25 + anchors.horizontalCenter: parent.horizontalCenter + QGCLabel { + text: "N" + color: qgcPal.text + font.pointSize: ScreenTools.smallFontPointSize + anchors.centerIn: parent + } + } + //-- Needle + Image { + id: compassNeedle + anchors.centerIn: parent + height: mainIsMap ? parent.height * 0.75 : 0 + width: height + source: "/custom/img/compass_needle.svg" + fillMode: Image.PreserveAspectFit + visible: mainIsMap + sourceSize.height: height + transform: [ + Rotation { + origin.x: compassNeedle.width / 2 + origin.y: compassNeedle.height / 2 + angle: _heading + }] + } + //-- Heading + Rectangle { + height: mainIsMap ? ScreenTools.defaultFontPixelHeight * 0.75 : 0 + width: mainIsMap ? ScreenTools.defaultFontPixelWidth * 3.5 : 0 + radius: ScreenTools.defaultFontPixelWidth * 0.25 + color: qgcPal.windowShade + visible: mainIsMap + anchors.bottom: parent.bottom + anchors.bottomMargin: ScreenTools.defaultFontPixelHeight * -0.25 + anchors.horizontalCenter: parent.horizontalCenter + QGCLabel { + text: _heading + color: qgcPal.text + font.pointSize: ScreenTools.smallFontPointSize + anchors.centerIn: parent + } + } + } + //-- Second Row + //-- Chronometer + QGCColoredImage { + height: _indicatorsHeight + width: height + source: "/custom/img/chronometer.svg" + fillMode: Image.PreserveAspectFit + sourceSize.height: height + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + color: qgcPal.text + } + QGCLabel { + id: firstLabel + text: { + if(activeVehicle) + return secondsToHHMMSS(activeVehicle.getFact("flightTime").value) + return "00:00:00" + } + color: _indicatorsColor + font.pointSize: ScreenTools.smallFontPointSize + Layout.fillWidth: true + Layout.minimumWidth: indicatorValueWidth + horizontalAlignment: Text.AlignLeft + } + //-- Ground Speed + QGCColoredImage { + height: _indicatorsHeight + width: height + source: "/custom/img/horizontal_speed.svg" + fillMode: Image.PreserveAspectFit + sourceSize.height: height + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + color: qgcPal.text + } + QGCLabel { + text: activeVehicle ? activeVehicle.groundSpeed.value.toFixed(1) + ' ' + activeVehicle.groundSpeed.units : "0.0" + color: _indicatorsColor + font.pointSize: ScreenTools.smallFontPointSize + Layout.fillWidth: true + Layout.minimumWidth: indicatorValueWidth + horizontalAlignment: firstLabel.horizontalAlignment + } + //-- Vertical Speed + QGCColoredImage { + height: _indicatorsHeight + width: height + source: "/custom/img/vertical_speed.svg" + fillMode: Image.PreserveAspectFit + sourceSize.height: height + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + color: qgcPal.text + + } + QGCLabel { + text: activeVehicle ? activeVehicle.climbRate.value.toFixed(1) + ' ' + activeVehicle.climbRate.units : "0.0" + color: _indicatorsColor + font.pointSize: ScreenTools.smallFontPointSize + Layout.fillWidth: true + Layout.minimumWidth: indicatorValueWidth + horizontalAlignment: firstLabel.horizontalAlignment + } + //-- Third Row + //-- Odometer + QGCColoredImage { + height: _indicatorsHeight + width: height + source: "/custom/img/odometer.svg" + fillMode: Image.PreserveAspectFit + sourceSize.height: height + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + color: qgcPal.text + + } + QGCLabel { + text: activeVehicle ? ('00000' + activeVehicle.flightDistance.value.toFixed(0)).slice(-5) + ' ' + activeVehicle.flightDistance.units : "00000" + color: _indicatorsColor + font.pointSize: ScreenTools.smallFontPointSize + Layout.fillWidth: true + Layout.minimumWidth: indicatorValueWidth + horizontalAlignment: firstLabel.horizontalAlignment + } + //-- Altitude + QGCColoredImage { + height: _indicatorsHeight + width: height + source: "/custom/img/altitude.svg" + fillMode: Image.PreserveAspectFit + sourceSize.height: height + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + color: qgcPal.text + + } + QGCLabel { + text: _altitude + color: _indicatorsColor + font.pointSize: ScreenTools.smallFontPointSize + Layout.fillWidth: true + Layout.minimumWidth: indicatorValueWidth + horizontalAlignment: firstLabel.horizontalAlignment + } + //-- Distance + QGCColoredImage { + height: _indicatorsHeight + width: height + source: "/custom/img/distance.svg" + fillMode: Image.PreserveAspectFit + sourceSize.height: height + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + color: qgcPal.text + + } + QGCLabel { + text: _distance ? _distanceStr : noGPS + color: _distance ? _indicatorsColor : qgcPal.colorOrange + font.pointSize: ScreenTools.smallFontPointSize + Layout.fillWidth: true + Layout.minimumWidth: indicatorValueWidth + horizontalAlignment: firstLabel.horizontalAlignment + } + } + } + //------------------------------------------------------------------------- + //-- Attitude Indicator + Rectangle { + color: qgcPal.window + width: attitudeIndicator.width * 0.5 + height: vehicleIndicator.height + anchors.top: vehicleIndicator.top + anchors.left: vehicleIndicator.right + } + Rectangle { + id: attitudeIndicator + anchors.bottom: vehicleIndicator.bottom + anchors.bottomMargin: ScreenTools.defaultFontPixelWidth * -0.5 + anchors.right: parent.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth + height: ScreenTools.defaultFontPixelHeight * 6 + width: height + radius: height * 0.5 + color: qgcPal.windowShade + CustomAttitudeWidget { + size: parent.height * 0.95 + vehicle: activeVehicle + showHeading: false + anchors.centerIn: parent + } + } +} diff --git a/custom-example/res/Images/CustomAppIcon.png b/custom-example/res/Images/CustomAppIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e9e79f6cd3df788dae2236254f5dfc2bcbff87 GIT binary patch literal 139148 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�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 + + + + Svg Vector Icons : http://www.onlinewebfonts.com/icon + + \ No newline at end of file diff --git a/custom-example/res/Images/PairingButton.svg b/custom-example/res/Images/PairingButton.svg deleted file mode 100644 index 1166e2088..000000000 --- a/custom-example/res/Images/PairingButton.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - diff --git a/custom-example/res/Images/PairingConnected.svg b/custom-example/res/Images/PairingConnected.svg deleted file mode 100644 index 02ac3be80..000000000 --- a/custom-example/res/Images/PairingConnected.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - diff --git a/custom-example/res/Images/PairingError.svg b/custom-example/res/Images/PairingError.svg deleted file mode 100644 index db1845142..000000000 --- a/custom-example/res/Images/PairingError.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - diff --git a/custom-example/res/Images/PairingIcon.svg b/custom-example/res/Images/PairingIcon.svg deleted file mode 100644 index aff3e41e0..000000000 --- a/custom-example/res/Images/PairingIcon.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - diff --git a/custom-example/res/Images/PairingIconLight.svg b/custom-example/res/Images/PairingIconLight.svg deleted file mode 100644 index 76a193c96..000000000 --- a/custom-example/res/Images/PairingIconLight.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - diff --git a/custom-example/res/Images/camera_photo.svg b/custom-example/res/Images/camera_photo.svg deleted file mode 100644 index 80e638941..000000000 --- a/custom-example/res/Images/camera_photo.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - diff --git a/custom-example/res/Images/camera_settings.svg b/custom-example/res/Images/camera_settings.svg deleted file mode 100644 index 97c97489b..000000000 --- a/custom-example/res/Images/camera_settings.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/custom-example/res/Images/camera_video.svg b/custom-example/res/Images/camera_video.svg deleted file mode 100644 index 7889b35b1..000000000 --- a/custom-example/res/Images/camera_video.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - diff --git a/custom-example/res/Images/gimbal_icon.svg b/custom-example/res/Images/gimbal_icon.svg deleted file mode 100644 index e4273b7b0..000000000 --- a/custom-example/res/Images/gimbal_icon.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - -670134 -Created with Sketch. - - diff --git a/custom-example/res/Images/gimbal_pitch.svg b/custom-example/res/Images/gimbal_pitch.svg deleted file mode 100644 index d53c3129c..000000000 --- a/custom-example/res/Images/gimbal_pitch.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/custom-example/res/Images/gimbal_pitch_indoors.svg b/custom-example/res/Images/gimbal_pitch_indoors.svg deleted file mode 100644 index f153e91bb..000000000 --- a/custom-example/res/Images/gimbal_pitch_indoors.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/custom-example/res/Images/gimbal_pitch_outdoors.svg b/custom-example/res/Images/gimbal_pitch_outdoors.svg deleted file mode 100644 index 90312c77c..000000000 --- a/custom-example/res/Images/gimbal_pitch_outdoors.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/custom-example/res/Images/gimbal_position.svg b/custom-example/res/Images/gimbal_position.svg deleted file mode 100644 index 14e72b8a6..000000000 --- a/custom-example/res/Images/gimbal_position.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/custom-example/res/Images/thermal-brightness.svg b/custom-example/res/Images/thermal-brightness.svg deleted file mode 100644 index 731922262..000000000 --- a/custom-example/res/Images/thermal-brightness.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - diff --git a/custom-example/res/Images/thermal-palette.svg b/custom-example/res/Images/thermal-palette.svg deleted file mode 100644 index 861543142..000000000 --- a/custom-example/res/Images/thermal-palette.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - diff --git a/custom-example/res/Images/thermal-pip.svg b/custom-example/res/Images/thermal-pip.svg deleted file mode 100644 index 22518b141..000000000 --- a/custom-example/res/Images/thermal-pip.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - diff --git a/custom-example/res/Images/thermal-standard.svg b/custom-example/res/Images/thermal-standard.svg deleted file mode 100644 index b5ecc3cc3..000000000 --- a/custom-example/res/Images/thermal-standard.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/custom-example/res/MainToolbar/CustomArmedIndicator.qml b/custom-example/res/MainToolbar/CustomArmedIndicator.qml deleted file mode 100644 index db1edb942..000000000 --- a/custom-example/res/MainToolbar/CustomArmedIndicator.qml +++ /dev/null @@ -1,56 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - * @file - * @author Gus Grubba - */ - -import QtQuick 2.11 -import QtQuick.Controls 1.2 - -import QGroundControl 1.0 -import QGroundControl.MultiVehicleManager 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.Palette 1.0 -import QGroundControl.ScreenTools 1.0 - -//------------------------------------------------------------------------- -//-- Armed Indicator -Rectangle { - anchors.top: parent.top - anchors.bottom: parent.bottom - width: labelRow.width + (ScreenTools.defaultFontPixelWidth * 6) - color: qgcPal.windowShade - - property bool _armed: activeVehicle ? activeVehicle.armed : false - - Row { - id: labelRow - spacing: ScreenTools.defaultFontPixelWidth - anchors.centerIn: parent - QGCLabel { - id: labelText - text: _armed ? qsTr("Armed") : qsTr("Disarmed") - color: qgcPal.text - font.pointSize: ScreenTools.defaultFontPointSize - anchors.verticalCenter: parent.verticalCenter - } - Rectangle { - height: ScreenTools.defaultFontPixelHeight * 0.5 - width: height - radius: height * 0.5 - color: _armed ? qgcPal.colorGreen : qgcPal.colorRed - border.color: qgcPal.window - border.width: 1 - anchors.verticalCenter: parent.verticalCenter - } - } - QGCMouseArea { - fillItem: parent - onClicked: _armed ? mainWindow.disarmVehicle() : mainWindow.armVehicle() - } -} diff --git a/custom-example/res/MainToolbar/CustomBatteryIndicator.qml b/custom-example/res/MainToolbar/CustomBatteryIndicator.qml deleted file mode 100644 index 6e58fb95a..000000000 --- a/custom-example/res/MainToolbar/CustomBatteryIndicator.qml +++ /dev/null @@ -1,207 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - * @file - * @author Gus Grubba - */ - -import QtQuick 2.11 -import QtQuick.Controls 1.4 -import QtQuick.Layouts 1.11 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.MultiVehicleManager 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Palette 1.0 - -//------------------------------------------------------------------------- -//-- Battery Indicator -Item { - id: _root - width: batteryIndicatorRow.width - anchors.top: parent.top - anchors.bottom: parent.bottom - - property var battery1: activeVehicle ? activeVehicle.battery : null - property var battery2: activeVehicle ? activeVehicle.battery2 : null - property bool hasSecondBattery: battery2 && battery2.voltage.value !== -1 - - function lowestBattery() { - if(activeVehicle) { - if(hasSecondBattery) { - if(activeVehicle.battery2.percentRemaining.value < activeVehicle.battery.percentRemaining.value) { - return activeVehicle.battery2 - } - } - return activeVehicle.battery - } - return null - } - - function getBatteryColor(battery) { - if(battery) { - if(battery.percentRemaining.value > 75) { - return qgcPal.text - } - if(battery.percentRemaining.value > 50) { - return qgcPal.colorOrange - } - if(battery.percentRemaining.value > 0.1) { - return qgcPal.colorRed - } - } - return qgcPal.colorGrey - } - - function getBatteryPercentageText(battery) { - if(battery) { - if(battery.percentRemaining.value > 98.9) { - return "100%" - } - if(battery.percentRemaining.value > 0.1) { - return battery.percentRemaining.valueString + battery.percentRemaining.units - } - if(battery.voltage.value >= 0) { - return battery.voltage.valueString + battery.voltage.units - } - } - return "N/A" - } - - Component { - id: batteryInfo - - Rectangle { - width: battCol.width + ScreenTools.defaultFontPixelWidth * 3 - height: battCol.height + ScreenTools.defaultFontPixelHeight * 2 - radius: ScreenTools.defaultFontPixelHeight * 0.5 - color: qgcPal.window - - Column { - id: battCol - spacing: ScreenTools.defaultFontPixelHeight * 0.5 - width: Math.max(battGrid.width, battLabel.width) - anchors.margins: ScreenTools.defaultFontPixelHeight - anchors.centerIn: parent - - QGCLabel { - id: battLabel - text: qsTr("Battery Status") - font.family: ScreenTools.demiboldFontFamily - anchors.horizontalCenter: parent.horizontalCenter - } - - GridLayout { - id: battGrid - anchors.margins: ScreenTools.defaultFontPixelHeight - columnSpacing: ScreenTools.defaultFontPixelWidth - columns: 2 - anchors.horizontalCenter: parent.horizontalCenter - - QGCLabel { - id: batteryLabel - text: qsTr("Battery 1") - Layout.alignment: Qt.AlignVCenter - } - QGCColoredImage { - height: batteryLabel.height - width: height - sourceSize.width: width - source: "/qmlimages/Battery.svg" - color: qgcPal.text - fillMode: Image.PreserveAspectFit - Rectangle { - color: getBatteryColor(activeVehicle ? activeVehicle.battery : null) - anchors.left: parent.left - anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.125 - height: parent.height * 0.35 - width: activeVehicle ? (activeVehicle.battery.percentRemaining.value / 100) * parent.width * 0.875 : 0 - anchors.verticalCenter: parent.verticalCenter - } - } - - QGCLabel { text: qsTr("Voltage:") } - QGCLabel { text: (battery1 && battery1.voltage.value !== -1) ? (battery1.voltage.valueString + " " + battery1.voltage.units) : "N/A" } - QGCLabel { text: qsTr("Accumulated Consumption:") } - QGCLabel { text: (battery1 && battery1.mahConsumed.value !== -1) ? (battery1.mahConsumed.valueString + " " + battery1.mahConsumed.units) : "N/A" } - Item { - width: 1 - height: 1 - visible: hasSecondBattery; - Layout.columnSpan: 2 - } - - QGCLabel { - text: qsTr("Battery 2") - visible: hasSecondBattery - Layout.alignment: Qt.AlignVCenter - } - QGCColoredImage { - height: batteryLabel.height - width: height - sourceSize.width: width - source: "/qmlimages/Battery.svg" - color: qgcPal.text - visible: hasSecondBattery - fillMode: Image.PreserveAspectFit - Rectangle { - color: getBatteryColor(activeVehicle ? activeVehicle.battery2 : null) - anchors.left: parent.left - anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.125 - height: parent.height * 0.35 - width: activeVehicle ? (activeVehicle.battery2.percentRemaining.value / 100) * parent.width * 0.875 : 0 - anchors.verticalCenter: parent.verticalCenter - } - } - - QGCLabel { text: qsTr("Voltage:"); visible: hasSecondBattery; } - QGCLabel { text: (battery2 && battery2.voltage.value !== -1) ? (battery2.voltage.valueString + " " + battery2.voltage.units) : "N/A"; visible: hasSecondBattery; } - QGCLabel { text: qsTr("Accumulated Consumption:"); visible: hasSecondBattery; } - QGCLabel { text: (battery2 && battery2.mahConsumed.value !== -1) ? (battery2.mahConsumed.valueString + " " + battery2.mahConsumed.units) : "N/A"; visible: hasSecondBattery; } - } - } - } - } - - Row { - id: batteryIndicatorRow - anchors.top: parent.top - anchors.bottom: parent.bottom - opacity: (activeVehicle && activeVehicle.battery.voltage.value >= 0) ? 1 : 0.5 - spacing: ScreenTools.defaultFontPixelWidth - QGCColoredImage { - anchors.top: parent.top - anchors.bottom: parent.bottom - width: height - sourceSize.width: width - source: "/qmlimages/Battery.svg" - color: qgcPal.text - fillMode: Image.PreserveAspectFit - Rectangle { - color: getBatteryColor(lowestBattery()) - anchors.left: parent.left - anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.25 - height: parent.height * 0.35 - width: activeVehicle ? (activeVehicle.battery.percentRemaining.value / 100) * parent.width * 0.75 : 0 - anchors.verticalCenter: parent.verticalCenter - } - } - QGCLabel { - text: getBatteryPercentageText(lowestBattery()) - font.pointSize: ScreenTools.smallFontPointSize - color: getBatteryColor(lowestBattery()) - anchors.verticalCenter: parent.verticalCenter - } - } - MouseArea { - anchors.fill: parent - onClicked: { - mainWindow.showPopUp(_root, batteryInfo) - } - } -} diff --git a/custom-example/res/MainToolbar/CustomGPSIndicator.qml b/custom-example/res/MainToolbar/CustomGPSIndicator.qml deleted file mode 100644 index 6dfc4f166..000000000 --- a/custom-example/res/MainToolbar/CustomGPSIndicator.qml +++ /dev/null @@ -1,120 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - * @file - * @author Gus Grubba - */ - -import QtQuick 2.11 -import QtQuick.Controls 1.4 -import QtQuick.Layouts 1.11 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.MultiVehicleManager 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Palette 1.0 - -import Custom.Widgets 1.0 - -//------------------------------------------------------------------------- -//-- GPS Indicator -Item { - id: _root - width: gpsRow.width - anchors.top: parent.top - anchors.bottom: parent.bottom - - function getGPSSignal() { - if(!activeVehicle || activeVehicle.gps.count.rawValue < 1 || activeVehicle.gps.hdop.rawValue > 1.4) { - return 0; - } else if(activeVehicle.gps.hdop.rawValue < 1.0) { - return 100; - } else if(activeVehicle.gps.hdop.rawValue < 1.1) { - return 75; - } else if(activeVehicle.gps.hdop.rawValue < 1.2) { - return 50; - } else { - return 25; - } - } - - Component { - id: gpsInfo - - Rectangle { - width: gpsCol.width + ScreenTools.defaultFontPixelWidth * 3 - height: gpsCol.height + ScreenTools.defaultFontPixelHeight * 2 - radius: ScreenTools.defaultFontPixelHeight * 0.5 - color: qgcPal.window - - Column { - id: gpsCol - spacing: ScreenTools.defaultFontPixelHeight * 0.5 - width: Math.max(gpsGrid.width, gpsLabel.width) - anchors.margins: ScreenTools.defaultFontPixelHeight - anchors.centerIn: parent - - QGCLabel { - id: gpsLabel - text: (activeVehicle && activeVehicle.gps.count.value >= 0) ? qsTr("GPS Status") : qsTr("GPS Data Unavailable") - font.family: ScreenTools.demiboldFontFamily - anchors.horizontalCenter: parent.horizontalCenter - } - - GridLayout { - id: gpsGrid - visible: (activeVehicle && activeVehicle.gps.count.value >= 0) - anchors.margins: ScreenTools.defaultFontPixelHeight - columnSpacing: ScreenTools.defaultFontPixelWidth - anchors.horizontalCenter: parent.horizontalCenter - columns: 2 - - QGCLabel { text: qsTr("GPS Count:") } - QGCLabel { text: activeVehicle ? activeVehicle.gps.count.valueString : qsTr("N/A", "No data to display") } - QGCLabel { text: qsTr("GPS Lock:") } - QGCLabel { text: activeVehicle ? activeVehicle.gps.lock.enumStringValue : qsTr("N/A", "No data to display") } - QGCLabel { text: qsTr("HDOP:") } - QGCLabel { text: activeVehicle ? activeVehicle.gps.hdop.valueString : qsTr("--.--", "No data to display") } - QGCLabel { text: qsTr("VDOP:") } - QGCLabel { text: activeVehicle ? activeVehicle.gps.vdop.valueString : qsTr("--.--", "No data to display") } - QGCLabel { text: qsTr("Course Over Ground:") } - QGCLabel { text: activeVehicle ? activeVehicle.gps.courseOverGround.valueString : qsTr("--.--", "No data to display") } - } - } - } - } - - Row { - id: gpsRow - anchors.top: parent.top - anchors.bottom: parent.bottom - spacing: ScreenTools.defaultFontPixelWidth * 0.25 - QGCColoredImage { - width: height - anchors.top: parent.top - anchors.bottom: parent.bottom - sourceSize.height: height - source: "/qmlimages/Gps.svg" - color: qgcPal.text - fillMode: Image.PreserveAspectFit - opacity: getGPSSignal() > 0 ? 1 : 0.5 - } - CustomSignalStrength { - anchors.verticalCenter: parent.verticalCenter - size: parent.height * 0.75 - percent: getGPSSignal() - } - } - - MouseArea { - anchors.fill: parent - onClicked: { - mainWindow.showPopUp(_root, gpsInfo) - } - } -} diff --git a/custom-example/res/MainToolbar/CustomMainToolBar.qml b/custom-example/res/MainToolbar/CustomMainToolBar.qml deleted file mode 100644 index 9b8d8a47c..000000000 --- a/custom-example/res/MainToolbar/CustomMainToolBar.qml +++ /dev/null @@ -1,286 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - * @file - * @author Gus Grubba - */ - -import QtQuick 2.11 -import QtQuick.Controls 2.4 -import QtQuick.Layouts 1.11 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.Palette 1.0 -import QGroundControl.MultiVehicleManager 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Controllers 1.0 - -import Custom.Widgets 1.0 - -Item { - id: toolBar - anchors.fill: parent - property string sectionTitle: qsTr("Fly") - property bool inPlanView: planViewLoader.visible - property bool inFlyView: rootBackground.visible - property color menuSeparatorColor: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(0,0,0,0.25) : Qt.rgba(1,1,1,0.25) - //------------------------------------------------------------------------- - //-- Setup can be invoked from c++ side - Connections { - target: setupWindow - onVisibleChanged: { - if(setupWindow.visible) { - vehicleSetup.checked = true - sectionTitle = vehicleSetup.text - } - } - } - //------------------------------------------------------------------------- - //-- Initial State - Component.onCompleted: { - flyButton.checked = true - sectionTitle = flyButton.text - } - //------------------------------------------------------------------------- - //-- Fly/Plan state toggle - onInPlanViewChanged: { - if(inPlanView) { - planButton.checked = true - sectionTitle = planButton.text - } - } - onInFlyViewChanged: { - if(inFlyView) { - flyButton.checked = true - sectionTitle = flyButton.text - } - } - Row { - id: iconRow - height: parent.height - anchors.left: parent.left - spacing: ScreenTools.defaultFontPixelWidth * 2 - - CustomIconButton { - height: parent.height - onPressed: { - if(drawer.visible) { - drawer.close() - } else { - drawer.open() - } - // Easter egg mechanism - _pressCount++ - eggTimer.restart() - if (_pressCount == 5) { - QGroundControl.corePlugin.showAdvancedUI = !QGroundControl.corePlugin.showAdvancedUI - } - } - property int _pressCount: 0 - Timer { - id: eggTimer - interval: 1000 - onTriggered: parent._pressCount = 0 - } - } - Rectangle { - width: 1 - height: parent.height - color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(0,0,0,0.15) : Qt.rgba(1,1,1,0.15) - } - //------------------------------------------------------------------------- - //-- Multi Vehicle Selector - Loader { - anchors.top: parent.top - anchors.bottom: parent.bottom - source: "/custom/CustomMultiVehicleSelector.qml" - visible: activeVehicle && !inPlanView - } - Rectangle { - width: 1 - height: parent.height - color: menuSeparatorColor - visible: activeVehicle && !inPlanView - } - //------------------------------------------------------------------------- - //-- Flight Mode - Loader { - anchors.top: parent.top - anchors.bottom: parent.bottom - source: "/custom/CustomModeIndicator.qml" - visible: activeVehicle && !inPlanView - } - } - //------------------------------------------------------------------------- - //-- Arm/Disarm - Loader { - anchors.top: parent.top - anchors.bottom: parent.bottom - anchors.horizontalCenter: parent.horizontalCenter - source: "/custom/CustomArmedIndicator.qml" - visible: activeVehicle && !inPlanView - } - //------------------------------------------------------------------------- - // Indicators - Loader { - source: inPlanView ? "/qml/PlanToolBarIndicators.qml" : "/custom/CustomMainToolBarIndicators.qml" - anchors.left: iconRow.right - anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 2 - anchors.right: parent.right - anchors.top: parent.top - anchors.bottom: parent.bottom - } - //------------------------------------------------------------------------- - // Parameter download progress bar - Rectangle { - anchors.bottom: parent.bottom - height: ScreenTools.defaultFontPixelheight * 0.25 - width: activeVehicle ? activeVehicle.parameterManager.loadProgress * parent.width : 0 - color: qgcPal.colorGreen - } - //------------------------------------------------------------------------- - // Bottom single pixel divider - Rectangle { - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom - height: 1 - color: menuSeparatorColor - } - //------------------------------------------------------------------------- - //-- Navigation Drawer (Left to Right, on command or using touch gestures) - Drawer { - id: drawer - y: header.height - width: navButtonWidth - height: mainWindow.height - header.height - closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside - background: Rectangle { - color: qgcPal.window - } - ButtonGroup { - id: buttonGroup - buttons: buttons.children - } - ColumnLayout { - id: buttons - spacing: 0 - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - Rectangle { - Layout.alignment: Qt.AlignVCenter - width: parent.width - height: 1 - color: menuSeparatorColor - } - CustomToolBarButton { - id: flyButton - spacing: 1 - text: qsTr("Fly") - icon.source: "/qmlimages/PaperPlane.svg" - Layout.fillWidth: true - onClicked: { - checked = true - drawer.close() - sectionTitle = text - mainWindow.showFlyView() - } - } - Rectangle { - Layout.alignment: Qt.AlignVCenter - width: parent.width - height: 1 - color: menuSeparatorColor - } - CustomToolBarButton { - id: planButton - text: qsTr("Plan") - icon.source: "/qmlimages/Plan.svg" - Layout.fillWidth: true - onClicked: { - checked = true - drawer.close() - sectionTitle = text - mainWindow.showPlanView() - } - } - Rectangle { - Layout.alignment: Qt.AlignVCenter - width: parent.width - height: 1 - color: menuSeparatorColor - } - CustomToolBarButton { - text: qsTr("Analyze") - icon.source: "/qmlimages/Analyze.svg" - Layout.fillWidth: true - onClicked: { - checked = true - drawer.close() - sectionTitle = text - mainWindow.showAnalyzeView() - } - } - Rectangle { - Layout.alignment: Qt.AlignVCenter - width: parent.width - height: 1 - color: menuSeparatorColor - } - CustomToolBarButton { - id: vehicleSetup - text: qsTr("Vehicle Setup") - icon.source: "/qmlimages/Gears.svg" - Layout.fillWidth: true - onClicked: { - checked = true - drawer.close() - sectionTitle = text - mainWindow.showSetupView() - } - } - Rectangle { - Layout.alignment: Qt.AlignVCenter - width: parent.width - height: 1 - color: menuSeparatorColor - } - } - ColumnLayout { - id: lowerButtons - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.right: parent.right - spacing: 0 - Rectangle { - Layout.alignment: Qt.AlignVCenter - width: parent.width - height: 1 - color: menuSeparatorColor - } - CustomToolBarButton { - id: settingsButton - text: qsTr("Settings") - icon.source: "/qmlimages/Gears.svg" - Layout.fillWidth: true - onClicked: { - checked = true - buttonGroup.checkState = Qt.Unchecked - drawer.close() - sectionTitle = text - mainWindow.showSettingsView() - } - } - Connections { - target: buttonGroup - onClicked: settingsButton.checked = false - } - } - } -} diff --git a/custom-example/res/MainToolbar/CustomMainToolBarIndicators.qml b/custom-example/res/MainToolbar/CustomMainToolBarIndicators.qml deleted file mode 100644 index a86c52d58..000000000 --- a/custom-example/res/MainToolbar/CustomMainToolBarIndicators.qml +++ /dev/null @@ -1,123 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - * @file - * @author Gus Grubba - */ - -import QtQuick 2.11 -import QtQuick.Controls 2.4 -import QtQuick.Dialogs 1.3 -import QtQuick.Layouts 1.11 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.MultiVehicleManager 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Palette 1.0 - -Item { - anchors.fill: parent - readonly property real _indicatorMargins: ScreenTools.defaultFontPixelHeight * 0.75 - Component.onCompleted: { - if(QGroundControl.pairingManager) { - if(!activeVehicle) { - pairingTimer.start() - } - } - } - //------------------------------------------------------------------------- - //-- Launch pairing manager if nothing connected - Timer { - id: pairingTimer - interval: 5000 - running: false; - repeat: false; - onTriggered: { - if(!activeVehicle) { - if(QGroundControl.pairingManager.firstBoot && pairingLoader.item) { - QGroundControl.pairingManager.firstBoot = false - pairingLoader.item.runPairing() - } - } - } - } - //------------------------------------------------------------------------- - //-- Waiting for a vehicle - Row { - id: waitForVehicle - spacing: ScreenTools.defaultFontPixelWidth - visible: !activeVehicle - anchors.top: parent.top - anchors.bottom: parent.bottom - anchors.left: parent.left - QGCColoredImage { - id: menuEdge - anchors.verticalCenter: parent.verticalCenter - height: ScreenTools.defaultFontPixelHeight - width: height - sourceSize.height: parent.height - fillMode: Image.PreserveAspectFit - source: "/qmlimages/PaperPlane.svg" - color: qgcPal.buttonText - } - QGCLabel { - anchors.verticalCenter: parent.verticalCenter - text: qsTr("Waiting for a vehicle") - font.pointSize: ScreenTools.mediumFontPointSize - font.family: ScreenTools.demiboldFontFamily - } - } - //------------------------------------------------------------------------- - //-- Pairing Indicator (not connected) - Row { - id: pairingRow - anchors.top: parent.top - anchors.bottom: parent.bottom - anchors.right: parent.right - anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 2 - spacing: ScreenTools.defaultFontPixelWidth * 2 - visible: !indicatorRow.visible - Loader { - id: pairingLoader - anchors.top: parent.top - anchors.bottom: parent.bottom - anchors.margins: _indicatorMargins - source: "/custom/PairingIndicator.qml" - } - } - //------------------------------------------------------------------------- - //-- Toolbar Indicators - Row { - id: indicatorRow - anchors.top: parent.top - anchors.bottom: parent.bottom - anchors.right: parent.right - anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 2 - spacing: ScreenTools.defaultFontPixelWidth * 2 - visible: activeVehicle && !communicationLost - Repeater { - model: activeVehicle ? activeVehicle.toolBarIndicators : [] - Loader { - anchors.top: parent.top - anchors.bottom: parent.bottom - anchors.margins: _indicatorMargins - source: modelData; - } - } - Item { - width: 1 - height: 1 - } - Loader { - anchors.top: parent.top - anchors.bottom: parent.bottom - anchors.margins: _indicatorMargins - source: "/toolbar/MessageIndicator.qml" - } - } -} diff --git a/custom-example/res/MainToolbar/CustomModeIndicator.qml b/custom-example/res/MainToolbar/CustomModeIndicator.qml deleted file mode 100644 index 770aa4d9f..000000000 --- a/custom-example/res/MainToolbar/CustomModeIndicator.qml +++ /dev/null @@ -1,101 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - * @file - * @author Gus Grubba - */ - - -import QtQuick 2.11 -import QtQuick.Controls 2.4 -import QtQuick.Layouts 1.11 -import QtQuick.Dialogs 1.3 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.MultiVehicleManager 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Palette 1.0 - -//------------------------------------------------------------------------- -//-- Mode Indicator -Item { - anchors.top: parent.top - anchors.bottom: parent.bottom - width: selectorRow.width - - Row { - id: selectorRow - spacing: ScreenTools.defaultFontPixelWidth - anchors.verticalCenter: parent.verticalCenter - QGCLabel { - id: flightModeSelector - text: activeVehicle ? activeVehicle.flightMode : qsTr("N/A") - color: qgcPal.text - font.pointSize: ScreenTools.defaultFontPointSize - anchors.verticalCenter: parent.verticalCenter - } - QGCColoredImage { - anchors.verticalCenter: parent.verticalCenter - height: ScreenTools.defaultFontPixelHeight * 0.5 - width: height - sourceSize.height: parent.height - fillMode: Image.PreserveAspectFit - source: "/res/DropArrow.svg" - color: qgcPal.text - } - } - MouseArea { - visible: activeVehicle && activeVehicle.flightModeSetAvailable - anchors.fill: parent - onClicked: flightModesMenu.open() - } - //------------------------------------------------------------------------- - //-- Flight Modes - Popup { - id: flightModesMenu - width: Math.min(mainWindow.width * 0.666, ScreenTools.defaultFontPixelWidth * 40) - height: mainWindow.height * 0.5 - modal: true - focus: true - parent: Overlay.overlay - x: Math.round((mainWindow.width - width) * 0.5) - y: Math.round((mainWindow.height - height) * 0.5) - closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside - property int selectedIndex: 0 - background: Rectangle { - anchors.fill: parent - color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75) - border.color: qgcPal.text - radius: ScreenTools.defaultFontPixelWidth - } - ColumnLayout { - id: comboListCol - spacing: ScreenTools.defaultFontPixelHeight - anchors.centerIn: parent - QGCLabel { - text: qsTr("Flight Modes") - Layout.alignment: Qt.AlignHCenter - } - Repeater { - model: activeVehicle ? activeVehicle.flightModes : [ ] - QGCButton { - text: modelData - Layout.minimumHeight: ScreenTools.defaultFontPixelHeight * 3 - Layout.minimumWidth: ScreenTools.defaultFontPixelWidth * 30 - Layout.fillHeight: true - Layout.fillWidth: true - Layout.alignment: Qt.AlignHCenter - onClicked: { - activeVehicle.flightMode = modelData - flightModesMenu.close() - } - } - } - } - } -} diff --git a/custom-example/res/MainToolbar/CustomMultiVehicleSelector.qml b/custom-example/res/MainToolbar/CustomMultiVehicleSelector.qml deleted file mode 100644 index 2c23e2fbf..000000000 --- a/custom-example/res/MainToolbar/CustomMultiVehicleSelector.qml +++ /dev/null @@ -1,104 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - * @file - * @author Gus Grubba - */ - -import QtQuick 2.11 -import QtQuick.Controls 1.4 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.MultiVehicleManager 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Palette 1.0 - -//------------------------------------------------------------------------- -//-- Multi Vehicle Selector -Item { - anchors.top: parent.top - anchors.bottom: parent.bottom - width: selectorRow.width - property bool _multiVehicles: QGroundControl.multiVehicleManager.vehicles.count > 1 - Component.onCompleted: { - updatemultiVehiclesMenu() - } - Connections { - target: QGroundControl.multiVehicleManager.vehicles - onCountChanged: updatemultiVehiclesMenu() - } - Row { - id: selectorRow - spacing: ScreenTools.defaultFontPixelWidth - anchors.verticalCenter: parent.verticalCenter - QGCColoredImage { - anchors.verticalCenter: parent.verticalCenter - height: ScreenTools.defaultFontPixelHeight - width: height - sourceSize.height: parent.height - fillMode: Image.PreserveAspectFit - source: "/qmlimages/PaperPlane.svg" - color: qgcPal.text - } - QGCLabel { - id: multiVehicleSelector - text: "Vehicle " + (activeVehicle ? activeVehicle.id : "None") - color: qgcPal.buttonText - anchors.verticalCenter: parent.verticalCenter - } - QGCColoredImage { - visible: _multiVehicles - anchors.verticalCenter: parent.verticalCenter - height: ScreenTools.defaultFontPixelHeight * 0.5 - width: height - sourceSize.height: parent.height - fillMode: Image.PreserveAspectFit - source: "/res/DropArrow.svg" - color: qgcPal.text - } - } - Menu { - id: multiVehiclesMenu - } - Component { - id: multiVehicleMenuItemComponent - MenuItem { - onTriggered: QGroundControl.multiVehicleManager.activeVehicle = vehicle - property int vehicleId: Number(text.split(" ")[1]) - property var vehicle: QGroundControl.multiVehicleManager.getVehicleById(vehicleId) - } - } - property var multiVehiclesMenuItems: [] - function updatemultiVehiclesMenu() { - if (_multiVehicles) { - // Remove old menu items - for (var i = 0; i < multiVehiclesMenuItems.length; i++) { - multiVehiclesMenu.removeItem(multiVehiclesMenuItems[i]) - } - multiVehiclesMenuItems.length = 0 - // Add new items - for (i = 0; i < QGroundControl.multiVehicleManager.vehicles.count; i++) { - var vehicle = QGroundControl.multiVehicleManager.vehicles.get(i) - var menuItem = multiVehicleMenuItemComponent.createObject(null, { "text": "Vehicle " + vehicle.id }) - multiVehiclesMenuItems.push(menuItem) - multiVehiclesMenu.insertItem(i, menuItem) - console.log("Vehicle " + vehicle.id) - } - } else { - console.log('No multiple vehicles: ' + QGroundControl.multiVehicleManager.vehicles.count) - } - } - MouseArea { - visible: _multiVehicles - anchors.fill: parent - onClicked: { - console.log('Clicked') - multiVehiclesMenu.popup() - } - } -} diff --git a/custom-example/res/MainToolbar/CustomRCRSSIIndicator.qml b/custom-example/res/MainToolbar/CustomRCRSSIIndicator.qml deleted file mode 100644 index 15a3eb80a..000000000 --- a/custom-example/res/MainToolbar/CustomRCRSSIIndicator.qml +++ /dev/null @@ -1,101 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - * @file - * @author Gus Grubba - */ - -import QtQuick 2.11 -import QtQuick.Controls 1.4 -import QtQuick.Layouts 1.11 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.MultiVehicleManager 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Palette 1.0 - -import Custom.Widgets 1.0 - -//------------------------------------------------------------------------- -//-- RC RSSI Indicator -Item { - id: _root - width: visible ? rssiRow.width : 0 - anchors.top: parent.top - anchors.bottom: parent.bottom - visible: activeVehicle ? activeVehicle.supportsRadio : true - - property bool _rcRSSIAvailable: activeVehicle ? activeVehicle.rcRSSI > 0 && activeVehicle.rcRSSI <= 100 : false - - Component { - id: rcRSSIInfo - - Rectangle { - width: rcrssiCol.width + ScreenTools.defaultFontPixelWidth * 3 - height: rcrssiCol.height + ScreenTools.defaultFontPixelHeight * 2 - radius: ScreenTools.defaultFontPixelHeight * 0.5 - color: qgcPal.window - - Column { - id: rcrssiCol - spacing: ScreenTools.defaultFontPixelHeight * 0.5 - width: Math.max(rcrssiGrid.width, rssiLabel.width) - anchors.margins: ScreenTools.defaultFontPixelHeight - anchors.centerIn: parent - - QGCLabel { - id: rssiLabel - text: activeVehicle ? (activeVehicle.rcRSSI !== 255 ? qsTr("RC RSSI Status") : qsTr("RC RSSI Data Unavailable")) : qsTr("N/A", "No data available") - font.family: ScreenTools.demiboldFontFamily - anchors.horizontalCenter: parent.horizontalCenter - } - - GridLayout { - id: rcrssiGrid - visible: _rcRSSIAvailable - anchors.margins: ScreenTools.defaultFontPixelHeight - columnSpacing: ScreenTools.defaultFontPixelWidth - columns: 2 - anchors.horizontalCenter: parent.horizontalCenter - - QGCLabel { text: qsTr("RSSI:") } - QGCLabel { text: activeVehicle ? (activeVehicle.rcRSSI + "%") : 0 } - } - } - } - } - - Row { - id: rssiRow - anchors.top: parent.top - anchors.bottom: parent.bottom - spacing: ScreenTools.defaultFontPixelWidth * 0.25 - QGCColoredImage { - width: height - anchors.top: parent.top - anchors.bottom: parent.bottom - sourceSize.height: height - source: "/custom/img/menu_rc.svg" - color: qgcPal.text - fillMode: Image.PreserveAspectFit - opacity: _rcRSSIAvailable ? 1 : 0.5 - } - CustomSignalStrength { - anchors.verticalCenter: parent.verticalCenter - size: parent.height * 0.75 - percent: _rcRSSIAvailable ? activeVehicle.rcRSSI : 0 - } - } - - MouseArea { - anchors.fill: parent - onClicked: { - mainWindow.showPopUp(_root, rcRSSIInfo) - } - } -} diff --git a/custom-example/res/PairingIndicator.qml b/custom-example/res/PairingIndicator.qml deleted file mode 100644 index e200148f8..000000000 --- a/custom-example/res/PairingIndicator.qml +++ /dev/null @@ -1,518 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2016 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -import QtQuick 2.11 -import QtQuick.Controls 2.4 -import QtQuick.Layouts 1.11 -import QtQuick.Dialogs 1.3 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.MultiVehicleManager 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Palette 1.0 - -//------------------------------------------------------------------------- -//-- GPS Indicator -Item { - id: _root - width: pairingRow.width * 1.1 - anchors.top: parent.top - anchors.bottom: parent.bottom - - property bool _light: qgcPal.globalTheme === QGCPalette.Light && !activeVehicle - property real _contentWidth: ScreenTools.defaultFontPixelWidth * 34 - property real _contentSpacing: ScreenTools.defaultFontPixelHeight * 0.5 - property real _rectWidth: _contentWidth - property real _rectHeight: _contentWidth * 0.75 - - property string kPairingManager: qsTr("Pairing Manager") - - function runPairing() { - QGroundControl.pairingManager.firstBoot = false - if(QGroundControl.pairingManager.pairedDeviceNameList.length > 0) { - connectionPopup.open() - } else { - mhPopup.open() - } - } - - Connections { - target: QGroundControl.pairingManager - //-- Connect automatically once paired - onPairingStatusChanged: { - if(QGroundControl.pairingManager.pairingStatus === PairingManager.PairingSuccess) { - if(QGroundControl.pairingManager.pairedVehicle !== "") { - QGroundControl.pairingManager.connectToPairedDevice(QGroundControl.pairingManager.pairedVehicle) - } - } - } - } - - Row { - id: pairingRow - spacing: ScreenTools.defaultFontPixelWidth - anchors.top: parent.top - anchors.bottom: parent.bottom - anchors.horizontalCenter: parent.horizontalCenter - QGCColoredImage { - id: pairingIcon - height: parent.height - width: height - color: qgcPal.text - source: "/custom/img/PairingIcon.svg" - sourceSize.width: width - fillMode: Image.PreserveAspectFit - smooth: true - mipmap: true - antialiasing: true - anchors.verticalCenter: parent.verticalCenter - } - QGCLabel { - text: qsTr("Pair Vehicle") - width: !activeVehicle ? (ScreenTools.defaultFontPixelWidth * 12) : 0 - visible: !activeVehicle - font.family: ScreenTools.demiboldFontFamily - anchors.verticalCenter: parent.verticalCenter - } - } - MouseArea { - anchors.fill: parent - onClicked: { - runPairing() - } - } - //------------------------------------------------------------------------- - //-- Microhard - Popup { - id: mhPopup - width: mhBody.width - height: mhBody.height - modal: true - focus: true - parent: Overlay.overlay - x: Math.round((mainWindow.width - width) * 0.5) - y: Math.round((mainWindow.height - height) * 0.5) - closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside - background: Rectangle { - anchors.fill: parent - color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75) - radius: ScreenTools.defaultFontPixelWidth * 0.25 - } - Item { - id: mhBody - width: mhCol.width + (ScreenTools.defaultFontPixelWidth * 8) - height: mhCol.height + (ScreenTools.defaultFontPixelHeight * 2) - anchors.centerIn: parent - Column { - id: mhCol - spacing: _contentSpacing - anchors.centerIn: parent - Item { width: 1; height: 1; } - QGCLabel { - text: kPairingManager - font.family: ScreenTools.demiboldFontFamily - font.pointSize: ScreenTools.mediumFontPointSize - anchors.horizontalCenter: parent.horizontalCenter - } - Rectangle { - width: _contentWidth - height: 1 - color: qgcPal.globalTheme !== QGCPalette.Light ? Qt.rgba(1,1,1,0.25) : Qt.rgba(0,0,0,0.25) - } - Item { width: 1; height: 1; } - QGCLabel { - text: qsTr("To connect to your vehicle, please click on the pairing button in order to put the vehicle in discovery mode") - width: _contentWidth - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter - anchors.horizontalCenter: parent.horizontalCenter - } - Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 2; } - QGCColoredImage { - height: ScreenTools.defaultFontPixelHeight * 6 - width: height - source: "/custom/img/PairingButton.svg" - sourceSize.height: height - fillMode: Image.PreserveAspectFit - mipmap: true - smooth: true - color: qgcPal.text - anchors.horizontalCenter: parent.horizontalCenter - } - Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 2; } - QGCButton { - text: qsTr("Pair a Vehicle") - width: _contentWidth - anchors.horizontalCenter: parent.horizontalCenter - onClicked: { - mhPopup.close() - progressPopup.open() - QGroundControl.pairingManager.startMicrohardPairing(); - } - } - Item { width: 1; height: 1; } - } - } - } - //------------------------------------------------------------------------- - //-- NFC - Popup { - id: nfcPopup - width: nfcBody.width - height: nfcBody.height - modal: true - focus: true - parent: Overlay.overlay - x: Math.round((mainWindow.width - width) * 0.5) - y: Math.round((mainWindow.height - height) * 0.5) - closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside - background: Rectangle { - anchors.fill: parent - color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75) - radius: ScreenTools.defaultFontPixelWidth * 0.25 - } - Item { - id: nfcBody - width: nfcCol.width + (ScreenTools.defaultFontPixelWidth * 8) - height: nfcCol.height + (ScreenTools.defaultFontPixelHeight * 2) - anchors.centerIn: parent - Column { - id: nfcCol - spacing: _contentSpacing - anchors.centerIn: parent - Item { width: 1; height: 1; } - QGCLabel { - text: kPairingManager - font.family: ScreenTools.demiboldFontFamily - font.pointSize: ScreenTools.mediumFontPointSize - anchors.horizontalCenter: parent.horizontalCenter - } - Rectangle { - width: _contentWidth - height: 1 - color: qgcPal.globalTheme !== QGCPalette.Light ? Qt.rgba(1,1,1,0.25) : Qt.rgba(0,0,0,0.25) - } - Item { width: 1; height: 1; } - Rectangle { - width: _rectWidth - height: _rectHeight - color: Qt.rgba(0,0,0,0) - border.color: qgcPal.text - border.width: 1 - anchors.horizontalCenter: parent.horizontalCenter - QGCLabel { - text: "Vehicle and Tablet Graphic" - anchors.centerIn: parent - } - } - Item { width: 1; height: 1; } - QGCLabel { - text: qsTr("Please make sure your vehicle is close to your Ground Station device") - width: _contentWidth - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter - anchors.horizontalCenter: parent.horizontalCenter - } - Item { width: 1; height: 1; } - QGCButton { - text: qsTr("Pair Via NFC") - width: _contentWidth - anchors.horizontalCenter: parent.horizontalCenter - onClicked: { - nfcPopup.close() - progressPopup.open() - QGroundControl.pairingManager.startNFCScan(); - } - } - Item { width: 1; height: 1; } - } - } - } - //------------------------------------------------------------------------- - //-- Pairing/Connection Progress - Popup { - id: progressPopup - width: progressBody.width - height: progressBody.height - modal: true - focus: true - parent: Overlay.overlay - x: Math.round((mainWindow.width - width) * 0.5) - y: Math.round((mainWindow.height - height) * 0.5) - closePolicy: cancelButton.visible ? Popup.NoAutoClose : (Popup.CloseOnEscape | Popup.CloseOnPressOutside) - background: Rectangle { - anchors.fill: parent - color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75) - radius: ScreenTools.defaultFontPixelWidth * 0.25 - } - Item { - id: progressBody - width: progressCol.width + (ScreenTools.defaultFontPixelWidth * 8) - height: progressCol.height + (ScreenTools.defaultFontPixelHeight * 2) - anchors.centerIn: parent - Column { - id: progressCol - spacing: _contentSpacing - anchors.centerIn: parent - Item { width: 1; height: 1; } - QGCLabel { - text: kPairingManager - font.family: ScreenTools.demiboldFontFamily - font.pointSize: ScreenTools.mediumFontPointSize - anchors.horizontalCenter: parent.horizontalCenter - } - QGCLabel { - text: QGroundControl.pairingManager ? QGroundControl.pairingManager.pairingStatusStr : "" - visible: !connectedIndicator.visible - anchors.horizontalCenter: parent.horizontalCenter - } - Rectangle { - width: _contentWidth - height: 1 - color: qgcPal.globalTheme !== QGCPalette.Light ? Qt.rgba(1,1,1,0.25) : Qt.rgba(0,0,0,0.25) - } - Item { width: 1; height: 1; } - //-- Pairing/Connecting - Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 3; visible: busyIndicator.visible; } - QGCColoredImage { - id: busyIndicator - height: ScreenTools.defaultFontPixelHeight * 4 - width: height - source: "/qmlimages/MapSync.svg" - sourceSize.height: height - fillMode: Image.PreserveAspectFit - mipmap: true - smooth: true - color: qgcPal.text - visible: QGroundControl.pairingManager.pairingStatus === PairingManager.PairingActive || QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnecting - anchors.horizontalCenter: parent.horizontalCenter - RotationAnimation on rotation { - loops: Animation.Infinite - from: 360 - to: 0 - duration: 720 - running: busyIndicator.visible - } - } - Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 3; visible: busyIndicator.visible; } - //-- Error State - Image { - height: ScreenTools.defaultFontPixelHeight * 4 - width: height - source: "/custom/img/PairingError.svg" - sourceSize.height: height - fillMode: Image.PreserveAspectFit - mipmap: true - smooth: true - visible: QGroundControl.pairingManager.errorState - anchors.horizontalCenter: parent.horizontalCenter - } - //-- Connection Successful - Image { - id: connectedIndicator - height: width * 0.2 - width: _contentWidth - source: "/custom/img/PairingConnected.svg" - sourceSize.height: height - fillMode: Image.PreserveAspectFit - mipmap: true - smooth: true - visible: QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnected - anchors.horizontalCenter: parent.horizontalCenter - } - Item { width: 1; height: _contentSpacing; visible: connectedIndicator.visible; } - QGCLabel { - text: QGroundControl.pairingManager.pairedVehicle - visible: connectedIndicator.visible - anchors.horizontalCenter: parent.horizontalCenter - } - QGCLabel { - text: qsTr("Connection Successful") - visible: connectedIndicator.visible - anchors.horizontalCenter: parent.horizontalCenter - } - Item { width: 1; height: _contentSpacing; } - //-- Buttons - QGCButton { - width: _contentWidth - visible: QGroundControl.pairingManager ? (QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnected) : false - text: qsTr("Done") - anchors.horizontalCenter: parent.horizontalCenter - onClicked: { - progressPopup.close() - } - } - QGCButton { - text: qsTr("Pair Another") - width: _contentWidth - visible: QGroundControl.pairingManager ? (QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnected) : false - anchors.horizontalCenter: parent.horizontalCenter - onClicked: { - progressPopup.close() - mhPopup.open() - } - } - QGCButton { - text: qsTr("Try Again") - width: _contentWidth - visible: QGroundControl.pairingManager ? QGroundControl.pairingManager.errorState : false - anchors.horizontalCenter: parent.horizontalCenter - onClicked: { - progressPopup.close() - runPairing() - } - } - QGCButton { - id: cancelButton - width: _contentWidth - visible: QGroundControl.pairingManager ? (QGroundControl.pairingManager.pairingStatus === PairingManager.PairingActive || QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnecting || QGroundControl.pairingManager.errorState) : false - text: qsTr("Cancel") - anchors.horizontalCenter: parent.horizontalCenter - onClicked: { - if(QGroundControl.pairingManager.pairingStatus === PairingManager.PairingActive) - QGroundControl.pairingManager.stopPairing() - else { - //-- TODO: Cancel connection to paired device - } - progressPopup.close() - } - } - Item { width: 1; height: 1; } - } - } - } - //------------------------------------------------------------------------- - //-- Connection Manager - Popup { - id: connectionPopup - width: connectionBody.width - height: connectionBody.height - modal: true - focus: true - parent: Overlay.overlay - x: Math.round((mainWindow.width - width) * 0.5) - y: Math.round((mainWindow.height - height) * 0.5) - closePolicy: cancelButton.visible ? Popup.NoAutoClose : (Popup.CloseOnEscape | Popup.CloseOnPressOutside) - background: Rectangle { - anchors.fill: parent - color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75) - radius: ScreenTools.defaultFontPixelWidth * 0.25 - } - Item { - id: connectionBody - width: connectionCol.width + (ScreenTools.defaultFontPixelWidth * 8) - height: connectionCol.height + (ScreenTools.defaultFontPixelHeight * 2) - anchors.centerIn: parent - Column { - id: connectionCol - spacing: _contentSpacing - anchors.centerIn: parent - Item { width: 1; height: 1; } - QGCLabel { - text: kPairingManager - font.family: ScreenTools.demiboldFontFamily - font.pointSize: ScreenTools.mediumFontPointSize - anchors.horizontalCenter: parent.horizontalCenter - } - Rectangle { - width: _contentWidth - height: 1 - color: qgcPal.globalTheme !== QGCPalette.Light ? Qt.rgba(1,1,1,0.25) : Qt.rgba(0,0,0,0.25) - } - Item { width: 1; height: 1; } - QGCLabel { - text: qsTr("List Of Available Devices") - visible: QGroundControl.pairingManager ? (QGroundControl.pairingManager.pairedDeviceNameList.length > 0 && !cancelButton.visible) : false - font.family: ScreenTools.demiboldFontFamily - } - Item { width: 1; height: 1; } - GridLayout { - columns: 3 - visible: QGroundControl.pairingManager ? (QGroundControl.pairingManager.pairedDeviceNameList.length > 0 && !cancelButton.visible) : false - columnSpacing: ScreenTools.defaultFontPixelWidth - rowSpacing: ScreenTools.defaultFontPixelHeight * 0.25 - anchors.horizontalCenter: parent.horizontalCenter - property var _pairModel: QGroundControl.pairingManager ? QGroundControl.pairingManager.pairedDeviceNameList : [] - Repeater { - model: parent._pairModel - delegate: QGCLabel { - text: modelData - Layout.row: index - Layout.column: 0 - Layout.minimumWidth:ScreenTools.defaultFontPixelWidth * 14 - Layout.fillWidth: true - } - } - Repeater { - model: parent._pairModel - delegate: QGCButton { - text: qsTr("Connect") - Layout.row: index - Layout.column: 1 - onClicked: { - QGroundControl.pairingManager.connectToPairedDevice(modelData) - connectionPopup.close() - progressPopup.open() - } - } - } - Repeater { - model: parent._pairModel - delegate: QGCColoredImage { - Layout.preferredWidth: ScreenTools.defaultFontPixelHeight * 1.5 - Layout.preferredHeight: ScreenTools.defaultFontPixelHeight * 1.5 - sourceSize.height: height - source: "/res/TrashDelete.svg" - color: qgcPal.colorRed - Layout.row: index - Layout.column: 2 - MouseArea { - anchors.fill: parent - onClicked: { - removePrompt.open() - } - } - MessageDialog { - id: removePrompt - title: qsTr("Remove Paired Vehicle") - text: qsTr("Confirm removing %1?").arg(modelData) - standardButtons: StandardButton.Yes | StandardButton.No - onNo: removePrompt.close() - onYes: { - QGroundControl.pairingManager.removePairedDevice(modelData) - removePrompt.close() - } - } - } - } - } - Item { width: 1; height: _contentSpacing; } - QGCButton { - width: _contentWidth - text: qsTr("Close") - anchors.horizontalCenter: parent.horizontalCenter - onClicked: { - connectionPopup.close() - } - } - QGCButton { - text: qsTr("Pair Another") - width: _contentWidth - anchors.horizontalCenter: parent.horizontalCenter - onClicked: { - connectionPopup.close() - mhPopup.open() - } - } - Item { width: 1; height: 1; } - } - } - } -} diff --git a/custom-example/res/PreFlightCheckList.qml b/custom-example/res/PreFlightCheckList.qml deleted file mode 100644 index dc3079df0..000000000 --- a/custom-example/res/PreFlightCheckList.qml +++ /dev/null @@ -1,175 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2016 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -import QtQuick 2.3 -import QtQuick.Controls 1.2 -import QtQml.Models 2.1 - -import QGroundControl 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.FlightDisplay 1.0 - -Rectangle { - width: mainColumn.width + ScreenTools.defaultFontPixelWidth * 3 - height: mainColumn.height + ScreenTools.defaultFontPixelHeight - color: qgcPal.windowShade - radius: 3 - - PreFlightCheckModel { - id: listModel - PreFlightCheckGroup { - name: qsTr("Initial checks") - - // Standard check list items (group 0) - Available from the start - PreFlightCheckButton { - name: qsTr("Hardware") - manualText: qsTr("Props mounted? Wings secured? Tail secured?") - } - - PreFlightBatteryCheck { - failurePercent: 40 - allowFailurePercentOverride: false - } - - PreFlightSensorsHealthCheck { - } - - PreFlightGPSCheck { - failureSatCount: 9 - allowOverrideSatCount: true - } - - PreFlightRCCheck { - } - } - - PreFlightCheckGroup { - name: qsTr("Please arm the vehicle here") - - PreFlightCheckButton { - name: qsTr("Actuators") - manualText: qsTr("Move all control surfaces. Did they work properly?") - } - - PreFlightCheckButton { - name: qsTr("Motors") - manualText: qsTr("Propellers free? Then throttle up gently. Working properly?") - } - - PreFlightCheckButton { - name: qsTr("Mission") - manualText: qsTr("Please confirm mission is valid (waypoints valid, no terrain collision).") - } - - PreFlightSoundCheck { - } - } - - PreFlightCheckGroup { - name: qsTr("Last preparations before launch") - - // Check list item group 2 - Final checks before launch - PreFlightCheckButton { - name: qsTr("Payload") - manualText: qsTr("Configured and started? Payload lid closed?") - } - - PreFlightCheckButton { - name: "Wind & weather" - manualText: qsTr("OK for your platform? Lauching into the wind?") - } - - PreFlightCheckButton { - name: qsTr("Flight area") - manualText: qsTr("Launch area and path free of obstacles/people?") - } - } - } - - property bool _passed: false - - function _handleGroupPassedChanged(index, passed) { - if (passed) { - // Collapse current group - var group = checkListRepeater.itemAt(index) - group._checked = false - // Expand next group - if (index + 1 < checkListRepeater.count) { - group = checkListRepeater.itemAt(index + 1) - group.enabled = true - group._checked = true - } - } - _passed = passed - } - - // We delay the updates when a group passes so the user can see all items green for a moment prior to hiding - Timer { - id: delayedGroupPassed - interval: 750 - - property int index - - onTriggered: _handleGroupPassedChanged(index, true /* passed */) - } - - Column { - id: mainColumn - width: 40 * ScreenTools.defaultFontPixelWidth - spacing: 0.8 * ScreenTools.defaultFontPixelWidth - anchors.left: parent.left - anchors.top: parent.top - anchors.topMargin: 0.6 * ScreenTools.defaultFontPixelWidth - anchors.leftMargin: 1.5 * ScreenTools.defaultFontPixelWidth - - function groupPassedChanged(index, passed) { - if (passed) { - delayedGroupPassed.index = index - delayedGroupPassed.restart() - } else { - _handleGroupPassedChanged(index, passed) - } - } - - // Header/title of checklist - Item { - width: parent.width - height: 1.75 * ScreenTools.defaultFontPixelHeight - - QGCLabel { - text: qsTr("Pre-Flight Checklist %1").arg(_passed ? qsTr("(passed)") : "") - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter - font.pointSize: ScreenTools.mediumFontPointSize - } - QGCButton { - width: 1.2 * ScreenTools.defaultFontPixelHeight - height: 1.2 * ScreenTools.defaultFontPixelHeight - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - tooltip: qsTr("Reset the checklist (e.g. after a vehicle reboot)") - - onClicked: model.reset() - - QGCColoredImage { - source: "/qmlimages/MapSyncBlack.svg" - color: qgcPal.buttonText - anchors.fill: parent - } - } - } - - // All check list items - Repeater { - id: checkListRepeater - model: listModel - } - } -} diff --git a/custom-example/src/AutoPilotPlugin/CustomAutoPilotPlugin.cc b/custom-example/src/AutoPilotPlugin/CustomAutoPilotPlugin.cc index 5942f3bf0..2003165f4 100644 --- a/custom-example/src/AutoPilotPlugin/CustomAutoPilotPlugin.cc +++ b/custom-example/src/AutoPilotPlugin/CustomAutoPilotPlugin.cc @@ -15,41 +15,36 @@ #include "QGCApplication.h" #include "QGCCorePlugin.h" -//----------------------------------------------------------------------------- CustomAutoPilotPlugin::CustomAutoPilotPlugin(Vehicle* vehicle, QObject* parent) : PX4AutoPilotPlugin(vehicle, parent) { + // Whenever we go on/out of advanced mode the available list of settings pages will change connect(qgcApp()->toolbox()->corePlugin(), &QGCCorePlugin::showAdvancedUIChanged, this, &CustomAutoPilotPlugin::_advancedChanged); } -//----------------------------------------------------------------------------- -void -CustomAutoPilotPlugin::_advancedChanged(bool) +// This signals that when Advanced Mode changes the list of Vehicle Settings page also changed +void CustomAutoPilotPlugin::_advancedChanged(bool) { _components.clear(); emit vehicleComponentsChanged(); } -//----------------------------------------------------------------------------- -const QVariantList& -CustomAutoPilotPlugin::vehicleComponents() +// This allows us to hide most Vehicle Setup pages unless we are in Advanced Mmode +const QVariantList& CustomAutoPilotPlugin::vehicleComponents() { if (_components.count() == 0 && !_incorrectParameterVersion) { if (_vehicle) { bool showAdvanced = qgcApp()->toolbox()->corePlugin()->showAdvancedUI(); - qDebug() << "Loading components:" << showAdvanced; if (_vehicle->parameterManager()->parametersReady()) { - if(showAdvanced) { - _airframeComponent = new AirframeComponent(_vehicle, this); - _airframeComponent->setupTriggerSignals(); - _components.append(QVariant::fromValue(reinterpret_cast(_airframeComponent))); - } - if (!_vehicle->hilMode()) { + if (showAdvanced) { + _airframeComponent = new AirframeComponent(_vehicle, this); + _airframeComponent->setupTriggerSignals(); + _components.append(QVariant::fromValue(reinterpret_cast(_airframeComponent))); + _sensorsComponent = new SensorsComponent(_vehicle, this); _sensorsComponent->setupTriggerSignals(); _components.append(QVariant::fromValue(reinterpret_cast(_sensorsComponent))); - } - if(showAdvanced) { + _radioComponent = new PX4RadioComponent(_vehicle, this); _radioComponent->setupTriggerSignals(); _components.append(QVariant::fromValue(reinterpret_cast(_radioComponent))); @@ -71,7 +66,7 @@ CustomAutoPilotPlugin::vehicleComponents() _safetyComponent->setupTriggerSignals(); _components.append(QVariant::fromValue(reinterpret_cast(_safetyComponent))); - if(showAdvanced) { + if (showAdvanced) { _tuningComponent = new PX4TuningComponent(_vehicle, this); _tuningComponent->setupTriggerSignals(); _components.append(QVariant::fromValue(reinterpret_cast(_tuningComponent))); @@ -83,22 +78,9 @@ CustomAutoPilotPlugin::vehicleComponents() _components.append(QVariant::fromValue(reinterpret_cast(_cameraComponent))); } } - - //-- Is there an ESP8266 Connected? - if(_vehicle->parameterManager()->parameterExists(MAV_COMP_ID_UDP_BRIDGE, "SW_VER")) { - _esp8266Component = new ESP8266Component(_vehicle, this); - _esp8266Component->setupTriggerSignals(); - _components.append(QVariant::fromValue(reinterpret_cast(_esp8266Component))); - } } else { qWarning() << "Call to vehicleCompenents prior to parametersReady"; } - - if(_vehicle->parameterManager()->parameterExists(_vehicle->id(), "SLNK_RADIO_CHAN")) { - _syslinkComponent = new SyslinkComponent(_vehicle, this); - _syslinkComponent->setupTriggerSignals(); - _components.append(QVariant::fromValue(reinterpret_cast(_syslinkComponent))); - } } else { qWarning() << "Internal error"; } diff --git a/custom-example/src/AutoPilotPlugin/CustomAutoPilotPlugin.h b/custom-example/src/AutoPilotPlugin/CustomAutoPilotPlugin.h index 9b20b4d89..e3bbbc039 100644 --- a/custom-example/src/AutoPilotPlugin/CustomAutoPilotPlugin.h +++ b/custom-example/src/AutoPilotPlugin/CustomAutoPilotPlugin.h @@ -15,15 +15,17 @@ #include "PX4AutoPilotPlugin.h" #include "Vehicle.h" -/// Custom overrides from standard PX4AutoPilotPlugin implementation class CustomAutoPilotPlugin : public PX4AutoPilotPlugin { Q_OBJECT public: CustomAutoPilotPlugin(Vehicle* vehicle, QObject* parent); - const QVariantList& vehicleComponents() override; + + const QVariantList& vehicleComponents() final; + private slots: void _advancedChanged (bool advanced); + private: QVariantList _components; diff --git a/custom-example/src/CustomPlugin.cc b/custom-example/src/CustomPlugin.cc index e7f2d9e8f..4057d619d 100644 --- a/custom-example/src/CustomPlugin.cc +++ b/custom-example/src/CustomPlugin.cc @@ -16,8 +16,6 @@ #include "MAVLinkLogManager.h" #include "CustomPlugin.h" -#include "CustomQuickInterface.h" -#include "CustomVideoManager.h" #include "MultiVehicleManager.h" #include "QGCApplication.h" @@ -28,93 +26,72 @@ QGC_LOGGING_CATEGORY(CustomLog, "CustomLog") -CustomVideoReceiver::CustomVideoReceiver(QObject* parent) - : GstVideoReceiver(parent) +CustomOptions::CustomOptions(CustomPlugin*, QObject* parent) + : QGCOptions(parent) { } -CustomVideoReceiver::~CustomVideoReceiver() +// Firmware upgrade page is only shown in Advanced Mode. +bool CustomOptions::showFirmwareUpgrade() const { + return qgcApp()->toolbox()->corePlugin()->showAdvancedUI(); } -//----------------------------------------------------------------------------- -static QObject* -customQuickInterfaceSingletonFactory(QQmlEngine*, QJSEngine*) +// This custom build does not support conecting multiple vehicles to it. This in turn simplifies various parts of the QGC ui. +bool CustomOptions::enableMultiVehicleList(void) const { - qCDebug(CustomLog) << "Creating CustomQuickInterface instance"; - CustomQuickInterface* pIFace = new CustomQuickInterface(); - auto* pPlug = qobject_cast(qgcApp()->toolbox()->corePlugin()); - if(pPlug) { - pIFace->init(); - } else { - qCritical() << "Error obtaining instance of CustomPlugin"; - } - return pIFace; + return false; } -//----------------------------------------------------------------------------- -CustomOptions::CustomOptions(CustomPlugin*, QObject* parent) - : QGCOptions(parent) +// This allows you to show a custom overlay on the fly screen. +QUrl CustomOptions::flyViewOverlay(void) const { + return QUrl::fromUserInput("qrc:/custom/CustomFlyViewOverlay.qml"); } -//----------------------------------------------------------------------------- -bool -CustomOptions::showFirmwareUpgrade() const +// The standard instrement widget is now show. Only the custom overlay is shown. +CustomInstrumentWidget* CustomOptions::instrumentWidget(void) { - return qgcApp()->toolbox()->corePlugin()->showAdvancedUI(); + return nullptr; } -QColor -CustomOptions::toolbarBackgroundLight() const +// Normal QGC needs to work with an ESP8266 WiFi thing which is remarkably crappy. This in turns causes PX4 Pro calibration to fail +// quite often. There is a warning in regular QGC about this. Overriding the and returning true means that your custom vehicle has +// a reliable WiFi connection so don't show that warning. +bool CustomOptions::wifiReliableForCalibration(void) const { - return CustomPlugin::_windowShadeEnabledLightColor; + return true; } -QColor -CustomOptions::toolbarBackgroundDark() const -{ - return CustomPlugin::_windowShadeEnabledDarkColor; -} -//----------------------------------------------------------------------------- CustomPlugin::CustomPlugin(QGCApplication *app, QGCToolbox* toolbox) : QGCCorePlugin(app, toolbox) { - _pOptions = new CustomOptions(this, this); + + _options = new CustomOptions(this, this); _showAdvancedUI = false; } -//----------------------------------------------------------------------------- CustomPlugin::~CustomPlugin() { } -//----------------------------------------------------------------------------- -void -CustomPlugin::setToolbox(QGCToolbox* toolbox) +void CustomPlugin::setToolbox(QGCToolbox* toolbox) { QGCCorePlugin::setToolbox(toolbox); - qmlRegisterSingletonType("CustomQuickInterface", 1, 0, "CustomQuickInterface", customQuickInterfaceSingletonFactory); - //-- Disable automatic logging - toolbox->mavlinkLogManager()->setEnableAutoStart(false); - toolbox->mavlinkLogManager()->setEnableAutoUpload(false); + + // Allows us to be notified when the user goes in/out out advanced mode connect(qgcApp()->toolbox()->corePlugin(), &QGCCorePlugin::showAdvancedUIChanged, this, &CustomPlugin::_advancedChanged); } -//----------------------------------------------------------------------------- -void -CustomPlugin::_advancedChanged(bool changed) +void CustomPlugin::_advancedChanged(bool changed) { - //-- We are now in "Advanced Mode" (or not) - emit _pOptions->showFirmwareUpgradeChanged(changed); + // Firmware Upgrade page is only show in Advanced mode + emit _options->showFirmwareUpgradeChanged(changed); } //----------------------------------------------------------------------------- -void -CustomPlugin::addSettingsEntry(const QString& title, - const char* qmlFile, - const char* iconFile/*= nullptr*/) +void CustomPlugin::_addSettingsEntry(const QString& title, const char* qmlFile, const char* iconFile) { Q_CHECK_PTR(qmlFile); // 'this' instance will take ownership on the QmlComponentInfo instance @@ -130,118 +107,66 @@ QVariantList& CustomPlugin::settingsPages() { if(_customSettingsList.isEmpty()) { - addSettingsEntry(tr("General"), "qrc:/qml/GeneralSettings.qml", "qrc:/res/gear-white.svg"); - addSettingsEntry(tr("Comm Links"), "qrc:/qml/LinkSettings.qml", "qrc:/res/waves.svg"); - addSettingsEntry(tr("Offline Maps"),"qrc:/qml/OfflineMap.qml", "qrc:/res/waves.svg"); -#if defined(QGC_GST_MICROHARD_ENABLED) - addSettingsEntry(tr("Microhard"), "qrc:/qml/MicrohardSettings.qml"); -#endif -#if defined(QGC_GST_TAISYNC_ENABLED) - addSettingsEntry(tr("Taisync"), "qrc:/qml/TaisyncSettings.qml"); -#endif -#if defined(QGC_AIRMAP_ENABLED) - addSettingsEntry(tr("AirMap"), "qrc:/qml/AirmapSettings.qml"); -#endif - addSettingsEntry(tr("MAVLink"), "qrc:/qml/MavlinkSettings.qml", " qrc:/res/waves.svg"); - addSettingsEntry(tr("Console"), "qrc:/qml/QGroundControl/Controls/AppMessages.qml"); -#if defined(QGC_ENABLE_QZXING) - addSettingsEntry(tr("Barcode Test"),"qrc:/custom/BarcodeReader.qml"); -#endif + _addSettingsEntry(tr("General"), "qrc:/qml/GeneralSettings.qml", "qrc:/res/gear-white.svg"); + _addSettingsEntry(tr("Comm Links"), "qrc:/qml/LinkSettings.qml", "qrc:/res/waves.svg"); + _addSettingsEntry(tr("Offline Maps"),"qrc:/qml/OfflineMap.qml", "qrc:/res/waves.svg"); + _addSettingsEntry(tr("MAVLink"), "qrc:/qml/MavlinkSettings.qml", "qrc:/res/waves.svg"); + _addSettingsEntry(tr("Console"), "qrc:/qml/QGroundControl/Controls/AppMessages.qml"); #if defined(QT_DEBUG) //-- These are always present on Debug builds - addSettingsEntry(tr("Mock Link"), "qrc:/qml/MockLink.qml"); - addSettingsEntry(tr("Debug"), "qrc:/qml/DebugWindow.qml"); - addSettingsEntry(tr("Palette Test"),"qrc:/qml/QmlTest.qml"); + _addSettingsEntry(tr("Mock Link"), "qrc:/qml/MockLink.qml"); #endif } return _customSettingsList; } -//----------------------------------------------------------------------------- -QGCOptions* -CustomPlugin::options() +QGCOptions* CustomPlugin::options() { - return _pOptions; + return _options; } -//----------------------------------------------------------------------------- -QString -CustomPlugin::brandImageIndoor(void) const +QString CustomPlugin::brandImageIndoor(void) const { - return QStringLiteral("/custom/img/void.png"); + return QStringLiteral("/custom/img/CustomAppIcon.png"); } -//----------------------------------------------------------------------------- -QString -CustomPlugin::brandImageOutdoor(void) const +QString CustomPlugin::brandImageOutdoor(void) const { - return QStringLiteral("/custom/img/void.png"); + return QStringLiteral("/custom/img/CustomAppIcon.png"); } -//----------------------------------------------------------------------------- -bool -CustomPlugin::overrideSettingsGroupVisibility(QString name) +bool CustomPlugin::overrideSettingsGroupVisibility(QString name) { + // We have set up our own specific brand imaging. Hide the brand image settings such that the end user + // can't change it. if (name == BrandImageSettings::name) { return false; } return true; } -//----------------------------------------------------------------------------- -VideoManager* -CustomPlugin::createVideoManager(QGCApplication *app, QGCToolbox *toolbox) -{ - return new CustomVideoManager(app, toolbox); -} - -//----------------------------------------------------------------------------- -VideoReceiver* -CustomPlugin::createVideoReceiver(QObject* parent) -{ - return new CustomVideoReceiver(parent); -} - -//----------------------------------------------------------------------------- -QQmlApplicationEngine* -CustomPlugin::createRootWindow(QObject *parent) -{ - QQmlApplicationEngine* pEngine = new QQmlApplicationEngine(parent); - pEngine->addImportPath("qrc:/qml"); - pEngine->addImportPath("qrc:/Custom/Widgets"); - pEngine->addImportPath("qrc:/Custom/Camera"); - pEngine->rootContext()->setContextProperty("joystickManager", qgcApp()->toolbox()->joystickManager()); - pEngine->rootContext()->setContextProperty("debugMessageModel", AppMessages::getModel()); - pEngine->load(QUrl(QStringLiteral("qrc:/qml/MainRootWindow.qml"))); - return pEngine; -} - -//----------------------------------------------------------------------------- -bool -CustomPlugin::adjustSettingMetaData(const QString& settingsGroup, FactMetaData& metaData) +// This allows you to override/hide QGC Application settings +bool CustomPlugin::adjustSettingMetaData(const QString& settingsGroup, FactMetaData& metaData) { bool parentResult = QGCCorePlugin::adjustSettingMetaData(settingsGroup, metaData); + if (settingsGroup == AppSettings::settingsGroup) { - if (metaData.name() == AppSettings::appFontPointSizeName) { - #if defined(Q_OS_LINUX) - int defaultFontPointSize = 11; - metaData.setRawDefaultValue(defaultFontPointSize); - #endif - } else if (metaData.name() == AppSettings::indoorPaletteName) { - QVariant indoorPalette = 1; - metaData.setRawDefaultValue(indoorPalette); - parentResult = true; + // This tells QGC than when you are creating Plans while not connected to a vehicle + // the specific firmware/vehicle the plan is for. + if (metaData.name() == AppSettings::offlineEditingFirmwareTypeName) { + metaData.setRawDefaultValue(MAV_AUTOPILOT_PX4); + return false; + } else if (metaData.name() == AppSettings::offlineEditingVehicleTypeName) { + metaData.setRawDefaultValue(MAV_TYPE_QUADROTOR); + return false; } } + return parentResult; } -const QColor CustomPlugin::_windowShadeEnabledLightColor("#FFFFFF"); -const QColor CustomPlugin::_windowShadeEnabledDarkColor("#212529"); - -//----------------------------------------------------------------------------- -void -CustomPlugin::paletteOverride(QString colorName, QGCPalette::PaletteColorInfo_t& colorInfo) +// This modifies QGC colors palette to match possible custom corporate branding +void CustomPlugin::paletteOverride(QString colorName, QGCPalette::PaletteColorInfo_t& colorInfo) { if (colorName == QStringLiteral("window")) { colorInfo[QGCPalette::Dark][QGCPalette::ColorGroupEnabled] = QColor("#212529"); @@ -430,3 +355,11 @@ CustomPlugin::paletteOverride(QString colorName, QGCPalette::PaletteColorInfo_t& colorInfo[QGCPalette::Light][QGCPalette::ColorGroupDisabled] = QColor("#48d6ff"); } } + +// We override this so we can get access to QQmlApplicationEngine and use it to register our qml module +QQmlApplicationEngine* CustomPlugin::createQmlApplicationEngine(QObject* parent) +{ + QQmlApplicationEngine* qmlEngine = QGCCorePlugin::createQmlApplicationEngine(parent); + qmlEngine->addImportPath("qrc:/Custom/Widgets"); + return qmlEngine; +} diff --git a/custom-example/src/CustomPlugin.h b/custom-example/src/CustomPlugin.h index 6b6ca632b..53b63fc9f 100644 --- a/custom-example/src/CustomPlugin.h +++ b/custom-example/src/CustomPlugin.h @@ -24,48 +24,21 @@ class CustomSettings; Q_DECLARE_LOGGING_CATEGORY(CustomLog) -//-- Our own, custom video receiver -class CustomVideoReceiver : public GstVideoReceiver -{ - Q_OBJECT -public: - - explicit CustomVideoReceiver(QObject* parent = nullptr); - ~CustomVideoReceiver(); - -}; - -//----------------------------------------------------------------------------- -//-- Our own, custom options class CustomOptions : public QGCOptions { public: CustomOptions(CustomPlugin*, QObject* parent = nullptr); - bool wifiReliableForCalibration () const final { return true; } -#if defined(Q_OS_LINUX) - double toolbarHeightMultiplier () final { return 1.25; } -#endif - QUrl flyViewOverlay () const final { return QUrl::fromUserInput("qrc:/custom/CustomFlyView.qml"); } - QUrl preFlightChecklistUrl () const final { return QUrl::fromUserInput("qrc:/custom/PreFlightCheckList.qml"); } - //-- We have our own toolbar - QUrl mainToolbarUrl () const final { return QUrl::fromUserInput("qrc:/custom/CustomMainToolBar.qml"); } - QUrl planToolbarUrl () const final { return QUrl::fromUserInput("qrc:/custom/CustomMainToolBar.qml"); } - //-- Don't show instrument widget - CustomInstrumentWidget* instrumentWidget () final { return nullptr; } - bool showMavlinkLogOptions () const final { return false; } - bool showFirmwareUpgrade () const final; - //-- We handle multiple vehicles in a custom way - bool enableMultiVehicleList () const final { return false; } - //-- We handle our own map scale - bool enableMapScale () const final { return false; } - // TODO: Can't access QGCPalette without some workarounds, change this upstream - QColor toolbarBackgroundLight () const final; - QColor toolbarBackgroundDark () const final; + // Overrides from QGCOptions + + bool wifiReliableForCalibration (void) const final; + QUrl flyViewOverlay (void) const final; + CustomInstrumentWidget* instrumentWidget (void) final; + bool showFirmwareUpgrade (void) const final; + bool enableMultiVehicleList (void) const final; }; -//----------------------------------------------------------------------------- class CustomPlugin : public QGCCorePlugin { Q_OBJECT @@ -74,33 +47,25 @@ public: ~CustomPlugin(); // Overrides from QGCCorePlugin - QVariantList& settingsPages () final; - QGCOptions* options () final; - QString brandImageIndoor () const final; - QString brandImageOutdoor () const final; + QVariantList& settingsPages (void) final; + QGCOptions* options (void) final; + QString brandImageIndoor (void) const final; + QString brandImageOutdoor (void) const final; bool overrideSettingsGroupVisibility (QString name) final; - VideoManager* createVideoManager (QGCApplication* app, QGCToolbox* toolbox) final; - VideoReceiver* createVideoReceiver (QObject* parent) final; - QQmlApplicationEngine* createRootWindow (QObject* parent) final; bool adjustSettingMetaData (const QString& settingsGroup, FactMetaData& metaData) final; void paletteOverride (QString colorName, QGCPalette::PaletteColorInfo_t& colorInfo) final; + QQmlApplicationEngine* createQmlApplicationEngine (QObject* parent) final; + // Overrides from QGCTool void setToolbox (QGCToolbox* toolbox); - const static QColor _windowShadeEnabledLightColor; - const static QColor _windowShadeEnabledDarkColor; - private slots: - void _advancedChanged (bool advanced); + void _advancedChanged(bool advanced); private: - void - addSettingsEntry( - const QString& title, - const char* qmlFile, - const char* iconFile = nullptr); + void _addSettingsEntry(const QString& title, const char* qmlFile, const char* iconFile = nullptr); private: - CustomOptions* _pOptions = nullptr; - QVariantList _customSettingsList; // Not to be mixed up with QGCCorePlugin implementation + CustomOptions* _options = nullptr; + QVariantList _customSettingsList; // Not to be mixed up with QGCCorePlugin implementation }; diff --git a/custom-example/src/CustomQuickInterface.cc b/custom-example/src/CustomQuickInterface.cc deleted file mode 100644 index 320827040..000000000 --- a/custom-example/src/CustomQuickInterface.cc +++ /dev/null @@ -1,77 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - * @file - * @brief Custom QtQuick Interface - * @author Gus Grubba - */ - -#include "QGCApplication.h" -#include "AppSettings.h" -#include "SettingsManager.h" -#include "MAVLinkLogManager.h" -#include "QGCMapEngine.h" -#include "QGCApplication.h" -#include "PositionManager.h" - -#include "CustomPlugin.h" -#include "CustomQuickInterface.h" - -#include - -static const char* kGroupName = "CustomSettings"; -static const char* kShowGimbalCtl = "ShowGimbalCtl"; -static const char* kShowAttitudeWidget = "ShowAttitudeWidget"; - -//----------------------------------------------------------------------------- -CustomQuickInterface::CustomQuickInterface(QObject* parent) - : QObject(parent) -{ - qCDebug(CustomLog) << "CustomQuickInterface Created"; -} - -//----------------------------------------------------------------------------- -CustomQuickInterface::~CustomQuickInterface() -{ - qCDebug(CustomLog) << "CustomQuickInterface Destroyed"; -} - -//----------------------------------------------------------------------------- -void -CustomQuickInterface::init() -{ - QSettings settings; - settings.beginGroup(kGroupName); - _showGimbalControl = settings.value(kShowGimbalCtl, false).toBool(); - _showAttitudeWidget = settings.value(kShowAttitudeWidget, false).toBool(); -} - -//----------------------------------------------------------------------------- -void -CustomQuickInterface::setShowGimbalControl(bool set) -{ - if(_showGimbalControl != set) { - _showGimbalControl = set; - QSettings settings; - settings.beginGroup(kGroupName); - settings.setValue(kShowGimbalCtl,set); - emit showGimbalControlChanged(); - } -} - -//----------------------------------------------------------------------------- -void -CustomQuickInterface::setShowAttitudeWidget(bool set) -{ - if(_showAttitudeWidget != set) { - _showAttitudeWidget = set; - QSettings settings; - settings.beginGroup(kGroupName); - settings.setValue(kShowAttitudeWidget,set); - emit showAttitudeWidgetChanged(); - } -} diff --git a/custom-example/src/CustomQuickInterface.h b/custom-example/src/CustomQuickInterface.h deleted file mode 100644 index c0bc2e110..000000000 --- a/custom-example/src/CustomQuickInterface.h +++ /dev/null @@ -1,48 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - * @file - * @brief Custom QtQuick Interface - * @author Gus Grubba - */ - -#pragma once - -#include "Vehicle.h" - -#include -#include -#include -#include -#include - -//----------------------------------------------------------------------------- -// QtQuick Interface (UI) -class CustomQuickInterface : public QObject -{ - Q_OBJECT -public: - CustomQuickInterface(QObject* parent = nullptr); - ~CustomQuickInterface(); - Q_PROPERTY(bool showGimbalControl READ showGimbalControl WRITE setShowGimbalControl NOTIFY showGimbalControlChanged) - Q_PROPERTY(bool showAttitudeWidget READ showAttitudeWidget WRITE setShowAttitudeWidget NOTIFY showAttitudeWidgetChanged) - - bool showGimbalControl () { return _showGimbalControl; } - void setShowGimbalControl (bool set); - void init (); - - bool showAttitudeWidget () { return _showAttitudeWidget; } - void setShowAttitudeWidget (bool set); - -signals: - void showGimbalControlChanged (); - void showAttitudeWidgetChanged(); - -private: - bool _showGimbalControl = true; - bool _showAttitudeWidget = false; -}; diff --git a/custom-example/src/CustomVideoManager.cc b/custom-example/src/CustomVideoManager.cc deleted file mode 100644 index 73acf7b9c..000000000 --- a/custom-example/src/CustomVideoManager.cc +++ /dev/null @@ -1,29 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -#include "CustomVideoManager.h" -#include "MultiVehicleManager.h" -#include "CustomCameraManager.h" -#include "CustomCameraControl.h" - -//----------------------------------------------------------------------------- -CustomVideoManager::CustomVideoManager(QGCApplication* app, QGCToolbox* toolbox) - : VideoManager(app, toolbox) -{ -} - -//----------------------------------------------------------------------------- -void -CustomVideoManager::_updateSettings(unsigned id) -{ - if(!_videoSettings || !_videoReceiver) - return; - VideoManager::_updateSettings(id); -} - diff --git a/custom-example/src/CustomVideoManager.h b/custom-example/src/CustomVideoManager.h deleted file mode 100644 index 030b35a33..000000000 --- a/custom-example/src/CustomVideoManager.h +++ /dev/null @@ -1,28 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -#pragma once - -#include -#include -#include -#include - -#include "VideoManager.h" - -class CustomVideoManager : public VideoManager -{ - Q_OBJECT -public: - CustomVideoManager (QGCApplication* app, QGCToolbox* toolbox); - -protected: - void _updateSettings (unsigned id); - -}; diff --git a/custom-example/src/FirmwarePlugin/CustomCameraControl.cc b/custom-example/src/FirmwarePlugin/CustomCameraControl.cc deleted file mode 100644 index 7817a46c3..000000000 --- a/custom-example/src/FirmwarePlugin/CustomCameraControl.cc +++ /dev/null @@ -1,134 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - * @file - * @brief Camera Controller - * @author Gus Grubba - * - */ - -#include "CustomCameraControl.h" -#include "QGCCameraIO.h" - -QGC_LOGGING_CATEGORY(CustomCameraLog, "CustomCameraLog") -QGC_LOGGING_CATEGORY(CustomCameraVerboseLog, "CustomCameraVerboseLog") - -static const char* kCAM_IRPALETTE = "CAM_IRPALETTE"; -static const char* kCAM_NEXTVISION_IRPALETTE = "IR_SENS_POL"; - -//----------------------------------------------------------------------------- -CustomCameraControl::CustomCameraControl(const mavlink_camera_information_t *info, Vehicle* vehicle, int compID, QObject* parent) - : QGCCameraControl(info, vehicle, compID, parent) -{ -} - -//----------------------------------------------------------------------------- -bool -CustomCameraControl::takePhoto() -{ - bool res = false; - res = QGCCameraControl::takePhoto(); - return res; -} - -//----------------------------------------------------------------------------- -bool -CustomCameraControl::stopTakePhoto() -{ - bool res = QGCCameraControl::stopTakePhoto(); - return res; -} - -//----------------------------------------------------------------------------- -bool -CustomCameraControl::startVideo() -{ - bool res = QGCCameraControl::startVideo(); - return res; -} - -//----------------------------------------------------------------------------- -bool -CustomCameraControl::stopVideo() -{ - bool res = QGCCameraControl::stopVideo(); - return res; -} - -//----------------------------------------------------------------------------- -void -CustomCameraControl::setVideoMode() -{ - if(cameraMode() != CAM_MODE_VIDEO) { - qCDebug(CustomCameraLog) << "setVideoMode()"; - Fact* pFact = getFact(kCAM_MODE); - if(pFact) { - pFact->setRawValue(CAM_MODE_VIDEO); - _setCameraMode(CAM_MODE_VIDEO); - } - } -} - -//----------------------------------------------------------------------------- -void -CustomCameraControl::setPhotoMode() -{ - if(cameraMode() != CAM_MODE_PHOTO) { - qCDebug(CustomCameraLog) << "setPhotoMode()"; - Fact* pFact = getFact(kCAM_MODE); - if(pFact) { - pFact->setRawValue(CAM_MODE_PHOTO); - _setCameraMode(CAM_MODE_PHOTO); - } - } -} - -//----------------------------------------------------------------------------- -void -CustomCameraControl::_setVideoStatus(VideoStatus status) -{ - QGCCameraControl::_setVideoStatus(status); -} - -//----------------------------------------------------------------------------- -void -CustomCameraControl::handleCaptureStatus(const mavlink_camera_capture_status_t& cap) -{ - QGCCameraControl::handleCaptureStatus(cap); -} - -//----------------------------------------------------------------------------- -Fact* -CustomCameraControl::irPalette() -{ - if(_paramComplete) { - if(_activeSettings.contains(kCAM_IRPALETTE)) { - return getFact(kCAM_IRPALETTE); - } - else if(_activeSettings.contains(kCAM_NEXTVISION_IRPALETTE)) { - return getFact(kCAM_NEXTVISION_IRPALETTE); - } - } - return nullptr; -} - -//----------------------------------------------------------------------------- -void -CustomCameraControl::setThermalMode(ThermalViewMode mode) -{ - if(_paramComplete) { - if(vendor() == "NextVision" && _activeSettings.contains("CAM_SENSOR")) { - if(mode == THERMAL_FULL) { - getFact("CAM_SENSOR")->setRawValue(1); - } - else if(mode == THERMAL_OFF) { - getFact("CAM_SENSOR")->setRawValue(0); - } - } - } - QGCCameraControl::setThermalMode(mode); -} diff --git a/custom-example/src/FirmwarePlugin/CustomCameraControl.h b/custom-example/src/FirmwarePlugin/CustomCameraControl.h deleted file mode 100644 index 213af8dfa..000000000 --- a/custom-example/src/FirmwarePlugin/CustomCameraControl.h +++ /dev/null @@ -1,47 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - * @file - * @brief Camera Controller - * @author Gus Grubba - * - */ - -#pragma once - -#include "QGCCameraControl.h" - -#include -#include - -Q_DECLARE_LOGGING_CATEGORY(CustomCameraLog) -Q_DECLARE_LOGGING_CATEGORY(CustomCameraVerboseLog) - -//----------------------------------------------------------------------------- -class CustomCameraControl : public QGCCameraControl -{ - Q_OBJECT -public: - CustomCameraControl(const mavlink_camera_information_t* info, Vehicle* vehicle, int compID, QObject* parent = nullptr); - - Q_PROPERTY(Fact* irPalette READ irPalette NOTIFY parametersReady) - - Fact* irPalette (); - - bool takePhoto () override; - bool stopTakePhoto () override; - bool startVideo () override; - bool stopVideo () override; - void setVideoMode () override; - void setPhotoMode () override; - void handleCaptureStatus (const mavlink_camera_capture_status_t& capStatus) override; - void setThermalMode (ThermalViewMode mode) override; - -protected: - void _setVideoStatus (VideoStatus status) override; - -}; diff --git a/custom-example/src/FirmwarePlugin/CustomCameraManager.cc b/custom-example/src/FirmwarePlugin/CustomCameraManager.cc deleted file mode 100644 index df96efcb9..000000000 --- a/custom-example/src/FirmwarePlugin/CustomCameraManager.cc +++ /dev/null @@ -1,21 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - * @file - * @brief Camera Controller - * @author Gus Grubba - * - */ - -#include "QGCApplication.h" -#include "CustomCameraManager.h" - -//----------------------------------------------------------------------------- -CustomCameraManager::CustomCameraManager(Vehicle *vehicle) - : QGCCameraManager(vehicle) -{ -} diff --git a/custom-example/src/FirmwarePlugin/CustomCameraManager.h b/custom-example/src/FirmwarePlugin/CustomCameraManager.h deleted file mode 100644 index 72e37e2d5..000000000 --- a/custom-example/src/FirmwarePlugin/CustomCameraManager.h +++ /dev/null @@ -1,24 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2019 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - * @file - * @brief Camera Controller - * @author Gus Grubba - * - */ - -#pragma once - -#include "QGCCameraManager.h" - -//----------------------------------------------------------------------------- -class CustomCameraManager : public QGCCameraManager -{ - Q_OBJECT -public: - CustomCameraManager(Vehicle* vehicle); -}; diff --git a/custom-example/src/FirmwarePlugin/CustomFirmwarePlugin.cc b/custom-example/src/FirmwarePlugin/CustomFirmwarePlugin.cc index a460de252..bc5747cb3 100644 --- a/custom-example/src/FirmwarePlugin/CustomFirmwarePlugin.cc +++ b/custom-example/src/FirmwarePlugin/CustomFirmwarePlugin.cc @@ -13,17 +13,15 @@ #include "CustomFirmwarePlugin.h" #include "CustomAutoPilotPlugin.h" -#include "CustomCameraManager.h" -#include "CustomCameraControl.h" //----------------------------------------------------------------------------- CustomFirmwarePlugin::CustomFirmwarePlugin() { for (int i = 0; i < _flightModeInfoList.count(); i++) { FlightModeInfo_t& info = _flightModeInfoList[i]; - //-- Narrow the options to only these two - if (info.name != _altCtlFlightMode && - info.name != _posCtlFlightMode) { + //-- Narrow the flight mode options to only these + if (info.name != _holdFlightMode && info.name != _rtlFlightMode && info.name != _missionFlightMode) { + // No other flight modes can be set info.canBeSet = false; } } @@ -35,34 +33,23 @@ AutoPilotPlugin* CustomFirmwarePlugin::autopilotPlugin(Vehicle* vehicle) return new CustomAutoPilotPlugin(vehicle, vehicle); } -//----------------------------------------------------------------------------- -QGCCameraManager* -CustomFirmwarePlugin::createCameraManager(Vehicle *vehicle) -{ - return new CustomCameraManager(vehicle); -} - -//----------------------------------------------------------------------------- -QGCCameraControl* -CustomFirmwarePlugin::createCameraControl(const mavlink_camera_information_t* info, Vehicle *vehicle, int compID, QObject* parent) +const QVariantList& CustomFirmwarePlugin::toolBarIndicators(const Vehicle* vehicle) { - return new CustomCameraControl(info, vehicle, compID, parent); -} - -//----------------------------------------------------------------------------- -const QVariantList& -CustomFirmwarePlugin::toolBarIndicators(const Vehicle* vehicle) -{ - Q_UNUSED(vehicle); - if(_toolBarIndicatorList.size() == 0) { -#if defined(QGC_ENABLE_PAIRING) - _toolBarIndicatorList.append(QVariant::fromValue(QUrl::fromUserInput("qrc:/custom/PairingIndicator.qml"))); -#endif - _toolBarIndicatorList.append(QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/GPSIndicator.qml"))); - _toolBarIndicatorList.append(QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/TelemetryRSSIIndicator.qml"))); - _toolBarIndicatorList.append(QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/RCRSSIIndicator.qml"))); - _toolBarIndicatorList.append(QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/BatteryIndicator.qml"))); + if (_toolBarIndicatorList.size() == 0) { + // First call the base class to get the standard QGC list. This way we are guaranteed to always get + // any new toolbar indicators which are added upstream in our custom build. + _toolBarIndicatorList = FirmwarePlugin::toolBarIndicators(vehicle); + // Then specifically remove the RC RSSI indicator. + _toolBarIndicatorList.removeOne(QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/RCRSSIIndicator.qml"))); } return _toolBarIndicatorList; } +// Tells QGC that your vehicle has a gimbal on it. This will in turn cause thing like gimbal commands to point +// the camera straight down for surveys to be automatically added to Plans. +bool CustomFirmwarePlugin::hasGimbal(Vehicle* /*vehicle*/, bool& rollSupported, bool& pitchSupported, bool& yawSupported) +{ + rollSupported = false; + pitchSupported = true; + yawSupported = true; +} diff --git a/custom-example/src/FirmwarePlugin/CustomFirmwarePlugin.h b/custom-example/src/FirmwarePlugin/CustomFirmwarePlugin.h index 47aa0aff8..5162e8a8e 100644 --- a/custom-example/src/FirmwarePlugin/CustomFirmwarePlugin.h +++ b/custom-example/src/FirmwarePlugin/CustomFirmwarePlugin.h @@ -23,11 +23,12 @@ class CustomFirmwarePlugin : public PX4FirmwarePlugin Q_OBJECT public: CustomFirmwarePlugin(); + // FirmwarePlugin overrides - AutoPilotPlugin* autopilotPlugin (Vehicle* vehicle) override; - QGCCameraManager* createCameraManager (Vehicle *vehicle) override; - QGCCameraControl* createCameraControl (const mavlink_camera_information_t* info, Vehicle* vehicle, int compID, QObject* parent = nullptr) override; - const QVariantList& toolBarIndicators (const Vehicle* vehicle) override; + AutoPilotPlugin* autopilotPlugin (Vehicle* vehicle) final; + const QVariantList& toolBarIndicators (const Vehicle* vehicle) final; + bool hasGimbal (Vehicle* vehicle, bool& rollSupported, bool& pitchSupported, bool& yawSupported) final; + private: QVariantList _toolBarIndicatorList; }; diff --git a/custom-example/src/FirmwarePlugin/CustomFirmwarePluginFactory.cc b/custom-example/src/FirmwarePlugin/CustomFirmwarePluginFactory.cc index 6be526827..36ece796f 100644 --- a/custom-example/src/FirmwarePlugin/CustomFirmwarePluginFactory.cc +++ b/custom-example/src/FirmwarePlugin/CustomFirmwarePluginFactory.cc @@ -19,6 +19,7 @@ CustomFirmwarePluginFactory CustomFirmwarePluginFactoryImp; CustomFirmwarePluginFactory::CustomFirmwarePluginFactory() : _pluginInstance(nullptr) { + } QList CustomFirmwarePluginFactory::supportedFirmwareTypes() const @@ -28,9 +29,8 @@ QList CustomFirmwarePluginFactory::supportedFirmwareTypes() const return list; } -FirmwarePlugin* CustomFirmwarePluginFactory::firmwarePluginForAutopilot(MAV_AUTOPILOT autopilotType, MAV_TYPE vehicleType) +FirmwarePlugin* CustomFirmwarePluginFactory::firmwarePluginForAutopilot(MAV_AUTOPILOT autopilotType, MAV_TYPE /*vehicleType*/) { - Q_UNUSED(vehicleType); if (autopilotType == MAV_AUTOPILOT_PX4) { if (!_pluginInstance) { _pluginInstance = new CustomFirmwarePlugin; @@ -39,3 +39,11 @@ FirmwarePlugin* CustomFirmwarePluginFactory::firmwarePluginForAutopilot(MAV_AUTO } return nullptr; } + + +QList CustomFirmwarePluginFactory::supportedVehicleTypes(void) const +{ + QList mavTypes; + mavTypes.append(MAV_TYPE_QUADROTOR); + return mavTypes; +} diff --git a/custom-example/src/FirmwarePlugin/CustomFirmwarePluginFactory.h b/custom-example/src/FirmwarePlugin/CustomFirmwarePluginFactory.h index 6e8a28f71..ffe39bea6 100644 --- a/custom-example/src/FirmwarePlugin/CustomFirmwarePluginFactory.h +++ b/custom-example/src/FirmwarePlugin/CustomFirmwarePluginFactory.h @@ -17,13 +17,19 @@ class CustomFirmwarePlugin; +/// This custom implementation of FirmwarePluginFactory creates a custom build which only supports +/// PX4 Pro firmware running on a multi-rotor vehicle. This is turn removes portions of the QGC UI +/// related to other firmware and vehicle types. This creating a more simplified UI for a specific +/// type of vehicle. class CustomFirmwarePluginFactory : public FirmwarePluginFactory { Q_OBJECT public: CustomFirmwarePluginFactory(); - QList supportedFirmwareTypes () const override; - FirmwarePlugin* firmwarePluginForAutopilot (MAV_AUTOPILOT autopilotType, MAV_TYPE vehicleType) override; + QList supportedFirmwareTypes () const final; + FirmwarePlugin* firmwarePluginForAutopilot (MAV_AUTOPILOT autopilotType, MAV_TYPE vehicleType) final; + QList supportedVehicleTypes (void) const final; + private: CustomFirmwarePlugin* _pluginInstance; }; diff --git a/custom-example/updateqrc.py b/custom-example/updateqrc.py new file mode 100755 index 000000000..e5c491029 --- /dev/null +++ b/custom-example/updateqrc.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python +import os + +qgc_rc = "qgroundcontrol.qrc" +res_rc = "qgcresources.qrc" +qgc_exc = "qgroundcontrol.exclusion" +res_exc = "qgcresources.exclusion" + +def read_file(filename): + with open(filename) as src: + return [line.rstrip().lstrip() for line in src.readlines()] + +def process(src, exclusion, dst): + file1 = read_file(src) + file2 = read_file(exclusion) + file3 = open(dst, 'w') + for line in file1: + if line not in file2: + if line.startswith('", ">../", 1) + file3.write(newLine + '\n') + else: + print 'Excluded:', line + file3.close() + +def main(): + if(os.path.isfile(qgc_exc)): + process(os.path.join("../",qgc_rc), qgc_exc, qgc_rc) + if(os.path.isfile(res_exc)): + process(os.path.join("../",res_rc), res_exc, res_rc) + +if __name__ == '__main__': + main() diff --git a/src/QGCApplication.cc b/src/QGCApplication.cc index 7f9534f58..34671d22b 100644 --- a/src/QGCApplication.cc +++ b/src/QGCApplication.cc @@ -584,7 +584,8 @@ bool QGCApplication::_initForNormalAppBoot() QSettings settings; - _qmlAppEngine = toolbox()->corePlugin()->createRootWindow(this); + _qmlAppEngine = toolbox()->corePlugin()->createQmlApplicationEngine(this); + toolbox()->corePlugin()->createRootWindow(_qmlAppEngine); // Image provider for PX4 Flow QQuickImageProvider* pImgProvider = dynamic_cast(qgcApp()->toolbox()->imageProvider()); diff --git a/src/api/QGCCorePlugin.cc b/src/api/QGCCorePlugin.cc index d40477744..0d0948547 100644 --- a/src/api/QGCCorePlugin.cc +++ b/src/api/QGCCorePlugin.cc @@ -435,14 +435,18 @@ void QGCCorePlugin::instrumentValueAreaCreateDefaultSettings(const QString& defa } } -QQmlApplicationEngine* QGCCorePlugin::createRootWindow(QObject *parent) -{ - QQmlApplicationEngine* pEngine = new QQmlApplicationEngine(parent); - pEngine->addImportPath("qrc:/qml"); - pEngine->rootContext()->setContextProperty("joystickManager", qgcApp()->toolbox()->joystickManager()); - pEngine->rootContext()->setContextProperty("debugMessageModel", AppMessages::getModel()); - pEngine->load(QUrl(QStringLiteral("qrc:/qml/MainRootWindow.qml"))); - return pEngine; +QQmlApplicationEngine* QGCCorePlugin::createQmlApplicationEngine(QObject* parent) +{ + QQmlApplicationEngine* qmlEngine = new QQmlApplicationEngine(parent); + qmlEngine->addImportPath("qrc:/qml"); + qmlEngine->rootContext()->setContextProperty("joystickManager", qgcApp()->toolbox()->joystickManager()); + qmlEngine->rootContext()->setContextProperty("debugMessageModel", AppMessages::getModel()); + return qmlEngine; +} + +void QGCCorePlugin::createRootWindow(QQmlApplicationEngine* qmlEngine) +{ + qmlEngine->load(QUrl(QStringLiteral("qrc:/qml/MainRootWindow.qml"))); } bool QGCCorePlugin::mavlinkMessage(Vehicle* vehicle, LinkInterface* link, mavlink_message_t message) diff --git a/src/api/QGCCorePlugin.h b/src/api/QGCCorePlugin.h index 83e7b3595..a2b6f1835 100644 --- a/src/api/QGCCorePlugin.h +++ b/src/api/QGCCorePlugin.h @@ -110,8 +110,12 @@ public: virtual void instrumentValueAreaCreateDefaultSettings(const QString& defaultSettingsGroup); + /// Allows the plugin to override or get access to the QmlApplicationEngine to do things like add import + /// path or stuff things into the context prior to window creation. + virtual QQmlApplicationEngine* createQmlApplicationEngine(QObject* parent); + /// Allows the plugin to override the creation of the root (native) window. - virtual QQmlApplicationEngine* createRootWindow(QObject* parent); + virtual void createRootWindow(QQmlApplicationEngine* qmlEngine); /// Allows the plugin to override the creation of VideoManager. virtual VideoManager* createVideoManager(QGCApplication* app, QGCToolbox* toolbox); -- 2.22.0