From e390054d922eec35cb7620a7fa2c91a907530f50 Mon Sep 17 00:00:00 2001 From: Gus Grubba Date: Fri, 17 Feb 2017 23:04:19 -0500 Subject: [PATCH] Allow replacing instrument widget with custom widget --- .../FlightDisplayViewWidgets.qml | 51 ++++++++++++++----- src/api/QGCOptions.cc | 19 +++++++ src/api/QGCOptions.h | 32 ++++++++++++ src/ui/AppSettings.qml | 4 +- 4 files changed, 92 insertions(+), 14 deletions(-) diff --git a/src/FlightDisplay/FlightDisplayViewWidgets.qml b/src/FlightDisplay/FlightDisplayViewWidgets.qml index 4654da7ba..f6475d47d 100644 --- a/src/FlightDisplay/FlightDisplayViewWidgets.qml +++ b/src/FlightDisplay/FlightDisplayViewWidgets.qml @@ -15,12 +15,12 @@ import QtQuick.Dialogs 1.2 import QtLocation 5.3 import QtPositioning 5.2 -import QGroundControl 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.Palette 1.0 -import QGroundControl.Vehicle 1.0 -import QGroundControl.FlightMap 1.0 +import QGroundControl 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.Vehicle 1.0 +import QGroundControl.FlightMap 1.0 Item { id: _root @@ -48,13 +48,29 @@ Item { } function _setInstrumentWidget() { - var useAlternateInstruments = QGroundControl.virtualTabletJoystick || ScreenTools.isTinyScreen - if(useAlternateInstruments) { - instrumentsLoader.source = "qrc:/qml/QGCInstrumentWidgetAlternate.qml" - instrumentsLoader.state = "topMode" + if(QGroundControl.corePlugin.options.instrumentWidget.source.toString().length) { + instrumentsLoader.source = QGroundControl.corePlugin.options.instrumentWidget.source + switch(QGroundControl.corePlugin.options.instrumentWidget.widgetPosition) { + case CustomInstrumentWidget.POS_TOP_RIGHT: + instrumentsLoader.state = "topMode" + break; + case CustomInstrumentWidget.POS_BOTTOM_RIGHT: + instrumentsLoader.state = "bottomMode" + break; + case CustomInstrumentWidget.POS_CENTER_RIGHT: + default: + instrumentsLoader.state = "centerMode" + break; + } } else { - instrumentsLoader.source = "qrc:/qml/QGCInstrumentWidget.qml" - instrumentsLoader.state = "centerMode" + var useAlternateInstruments = QGroundControl.virtualTabletJoystick || ScreenTools.isTinyScreen + if(useAlternateInstruments) { + instrumentsLoader.source = "qrc:/qml/QGCInstrumentWidgetAlternate.qml" + instrumentsLoader.state = "topMode" + } else { + instrumentsLoader.source = "qrc:/qml/QGCInstrumentWidget.qml" + instrumentsLoader.state = "centerMode" + } } } @@ -108,6 +124,7 @@ Item { AnchorChanges { target: instrumentsLoader anchors.verticalCenter: undefined + anchors.bottom: undefined anchors.top: _root ? _root.top : undefined } }, @@ -116,8 +133,18 @@ Item { AnchorChanges { target: instrumentsLoader anchors.top: undefined + anchors.bottom: undefined anchors.verticalCenter: _root ? _root.verticalCenter : undefined } + }, + State { + name: "bottomMode" + AnchorChanges { + target: instrumentsLoader + anchors.top: undefined + anchors.verticalCenter: undefined + anchors.bottom: _root ? _root.bottom : undefined + } } ] } diff --git a/src/api/QGCOptions.cc b/src/api/QGCOptions.cc index 3b598fe3d..0955cec12 100644 --- a/src/api/QGCOptions.cc +++ b/src/api/QGCOptions.cc @@ -8,6 +8,7 @@ ****************************************************************************/ #include "QGCOptions.h" +#include /// @file /// @brief Core Plugin Interface for QGroundControl - Application Options @@ -15,5 +16,23 @@ QGCOptions::QGCOptions(QObject* parent) : QObject(parent) + , _defaultInstrumentWidget(NULL) { + qmlRegisterUncreatableType("QGroundControl", 1, 0, "CustomInstrumentWidget", "Reference only"); } + +CustomInstrumentWidget* +QGCOptions::instrumentWidget() +{ + if(!_defaultInstrumentWidget) { + _defaultInstrumentWidget = new CustomInstrumentWidget(this); + } + return _defaultInstrumentWidget; +} + +CustomInstrumentWidget::CustomInstrumentWidget(QObject* parent) + : QObject(parent) +{ +} + + diff --git a/src/api/QGCOptions.h b/src/api/QGCOptions.h index 1845d3abb..dbe141d4f 100644 --- a/src/api/QGCOptions.h +++ b/src/api/QGCOptions.h @@ -11,11 +11,13 @@ #include #include +#include /// @file /// @brief Core Plugin Interface for QGroundControl - Application Options /// @author Gus Grubba +class CustomInstrumentWidget; class QGCOptions : public QObject { Q_OBJECT @@ -32,6 +34,8 @@ public: Q_PROPERTY(double toolbarHeightMultiplier READ toolbarHeightMultiplier CONSTANT) Q_PROPERTY(double defaultFontPointSize READ defaultFontPointSize CONSTANT) Q_PROPERTY(bool enablePlanViewSelector READ enablePlanViewSelector CONSTANT) + Q_PROPERTY(CustomInstrumentWidget* instrumentWidget READ instrumentWidget CONSTANT) + //! Should QGC hide its settings menu and colapse it into one single menu (Settings and Vehicle Setup)? /*! @@ -83,4 +87,32 @@ public: @return True or false */ virtual bool enablePlanViewSelector () { return true; } + //! Provides an alternate instrument widget for the Fly View + /*! + @return An alternate widget (see QGCInstrumentWidget.qml, the default widget) + */ + virtual CustomInstrumentWidget* instrumentWidget(); +private: + CustomInstrumentWidget* _defaultInstrumentWidget; +}; + +//----------------------------------------------------------------------------- +class CustomInstrumentWidget : public QObject +{ + Q_OBJECT +public: + //-- Widget Position + enum Pos { + POS_TOP_RIGHT = 0, + POS_CENTER_RIGHT = 1, + POS_BOTTOM_RIGHT = 2, + }; + Q_ENUMS(Pos) + CustomInstrumentWidget(QObject* parent = NULL); + Q_PROPERTY(QUrl source READ source CONSTANT) + Q_PROPERTY(Pos widgetPosition READ widgetPosition NOTIFY widgetPositionChanged) + virtual QUrl source () { return QUrl(); } + virtual Pos widgetPosition () { return POS_CENTER_RIGHT; } +signals: + void widgetPositionChanged (); }; diff --git a/src/ui/AppSettings.qml b/src/ui/AppSettings.qml index 337aac725..5599e0252 100644 --- a/src/ui/AppSettings.qml +++ b/src/ui/AppSettings.qml @@ -35,8 +35,8 @@ Rectangle { QGCPalette { id: qgcPal } Component.onCompleted: { - //-- Default to General Settings - __rightPanel.source = "GeneralSettings.qml" + //-- Default Settings + __rightPanel.source = QGroundControl.corePlugin.settings[QGroundControl.corePlugin.defaltSettings].url } QGCFlickable { -- 2.22.0