diff --git a/custom-example/res/MainToolbar/CustomMainToolBarIndicators.qml b/custom-example/res/MainToolbar/CustomMainToolBarIndicators.qml index 8b956355d1f1a12fb800f4ed5bcf72a7431deefd..858bb85bb8d6737bf940f79fde16f57af34530e8 100644 --- a/custom-example/res/MainToolbar/CustomMainToolBarIndicators.qml +++ b/custom-example/res/MainToolbar/CustomMainToolBarIndicators.qml @@ -23,6 +23,29 @@ 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 { @@ -60,6 +83,7 @@ Item { spacing: ScreenTools.defaultFontPixelWidth * 2 visible: !indicatorRow.visible Loader { + id: pairingLoader anchors.top: parent.top anchors.bottom: parent.bottom anchors.margins: _indicatorMargins diff --git a/qgcimages.qrc b/qgcimages.qrc index 031ea95f2c56156268fb45afbf19d5ada73e5e5d..8d12d67fadd289b59f594b0e82c1f4c19acbb047 100644 --- a/qgcimages.qrc +++ b/qgcimages.qrc @@ -66,11 +66,11 @@ src/AutoPilotPlugins/PX4/Images/CameraTrigger.svg resources/check.svg src/QmlControls/checkbox-check.svg + src/FlightMap/Images/cOGPointer.svg src/MissionManager/CogWheel.svg + src/FlightMap/Images/compassDottedLine.svg src/FlightMap/Images/compassInstrumentArrow.svg src/FlightMap/Images/compassInstrumentDial.svg - src/FlightMap/Images/compassDottedLine.svg - src/FlightMap/Images/cOGPointer.svg src/ui/toolbar/Images/Connect.svg src/FlightMap/Images/crossHair.svg src/AutoPilotPlugins/PX4/Images/DatalinkLoss.svg @@ -121,6 +121,10 @@ src/AutoPilotPlugins/PX4/Images/no-logging-light.svg src/AutoPilotPlugins/PX4/Images/no-logging.svg src/AutoPilotPlugins/PX4/Images/ObjectAvoidance.svg + src/PairingManager/Images/PairingButton.svg + src/PairingManager/Images/PairingConnected.svg + src/PairingManager/Images/PairingError.svg + src/PairingManager/Images/PairingIcon.svg src/ui/toolbar/Images/PaperPlane.svg src/FlightMap/Images/PiP.svg src/FlightMap/Images/pipHide.svg @@ -181,9 +185,5 @@ src/ui/toolbar/Images/Yield.svg src/FlightMap/Images/ZoomMinus.svg src/FlightMap/Images/ZoomPlus.svg - - src/PairingManager/Images/PairingIcon.svg - src/PairingManager/Images/PairingIconLight.svg - diff --git a/src/PairingManager/Images/PairingButton.svg b/src/PairingManager/Images/PairingButton.svg new file mode 100644 index 0000000000000000000000000000000000000000..1166e2088531d3f02037d96689860f18e3ce50d9 --- /dev/null +++ b/src/PairingManager/Images/PairingButton.svg @@ -0,0 +1,23 @@ + + + + + + + diff --git a/src/PairingManager/Images/PairingConnected.svg b/src/PairingManager/Images/PairingConnected.svg new file mode 100644 index 0000000000000000000000000000000000000000..02ac3be8013eb9ef2c442180c1884149119dc910 --- /dev/null +++ b/src/PairingManager/Images/PairingConnected.svg @@ -0,0 +1,44 @@ + + + + + + + + + + diff --git a/src/PairingManager/Images/PairingError.svg b/src/PairingManager/Images/PairingError.svg new file mode 100644 index 0000000000000000000000000000000000000000..db184514218ec8b85ace94d8feb58ad60bbcdd14 --- /dev/null +++ b/src/PairingManager/Images/PairingError.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/src/PairingManager/Images/PairingIcon.svg b/src/PairingManager/Images/PairingIcon.svg index 23579e8cc8fc68f551c0da86eb59a8d368af9c05..aff3e41e0c410917695aabaa5bd7112bcdd3e70e 100644 --- a/src/PairingManager/Images/PairingIcon.svg +++ b/src/PairingManager/Images/PairingIcon.svg @@ -3,21 +3,29 @@ - - - - - + + diff --git a/src/PairingManager/PairingManager.cc b/src/PairingManager/PairingManager.cc index 84f8208d8c77157f8fb480b14945de083b69cc7a..96c02a5961edd7124561df9d2d19d23cfccc719a 100644 --- a/src/PairingManager/PairingManager.cc +++ b/src/PairingManager/PairingManager.cc @@ -70,7 +70,9 @@ PairingManager::_pairingCompleted(QString name) { _writeJson(_jsonDoc, _pairingCacheFile(name)); _remotePairingMap["NM"] = name; + _lastPaired = name; emit pairedListChanged(); + emit pairedVehicleChanged(); _app->informationMessageBoxOnMainThread("", tr("Paired with %1").arg(name)); setPairingStatus(PairingSuccess, tr("Pairing Successfull")); } @@ -154,7 +156,7 @@ PairingManager::_uploadFinished(void) } else { if(++_pairRetryCount > 3) { qCDebug(PairingManagerLog) << "Giving up"; - setPairingStatus(PairingError, tr("Too Many Errors")); + setPairingStatus(PairingError, tr("No Response From Vehicle")); _uploadManager->deleteLater(); _uploadManager = nullptr; } else { @@ -190,6 +192,15 @@ PairingManager::connectToPairedDevice(QString name) jsonReceived(json); } +//----------------------------------------------------------------------------- +void +PairingManager::removePairedDevice(QString name) +{ + QFile file(_pairingCacheFile(name)); + file.remove(); + emit pairedListChanged(); +} + //----------------------------------------------------------------------------- QStringList PairingManager::pairedDeviceNameList(void) diff --git a/src/PairingManager/PairingManager.h b/src/PairingManager/PairingManager.h index 71c79ae1afc7c641bc323f459fcb58adc72c4ddf..ada48de7394c1d530a2a9f37d59a6b3a2c028990 100644 --- a/src/PairingManager/PairingManager.h +++ b/src/PairingManager/PairingManager.h @@ -61,18 +61,23 @@ public: Q_ENUM(PairingStatus) - QStringList pairingLinkTypeStrings(void); - QString pairingStatusStr(void) const; - QStringList pairedDeviceNameList(void); - PairingStatus pairingStatus() { return _status; } - int nfcIndex(void) { return _nfcIndex; } - int microhardIndex(void) { return _microhardIndex; } - void setStatusMessage(PairingStatus status, QString statusStr) { emit setPairingStatus(status, statusStr); } - void jsonReceived(QString json) { emit parsePairingJson(json); } + QStringList pairingLinkTypeStrings (void); + QString pairingStatusStr (void) const; + QStringList pairedDeviceNameList (void); + PairingStatus pairingStatus () { return _status; } + QString pairedVehicle () { return _lastPaired; } + int nfcIndex (void) { return _nfcIndex; } + int microhardIndex (void) { return _microhardIndex; } + bool firstBoot () { return _firstBoot; } + bool errorState () { return _status == PairingRejected || _status == PairingConnectionRejected || _status == PairingError; } + void setStatusMessage (PairingStatus status, QString statusStr) { emit setPairingStatus(status, statusStr); } + void jsonReceived (QString json) { emit parsePairingJson(json); } + void setFirstBoot (bool set) { _firstBoot = set; emit firstBootChanged(); } #ifdef __android__ - static void setNativeMethods(void); + static void setNativeMethods (void); #endif - Q_INVOKABLE void connectToPairedDevice(QString name); + Q_INVOKABLE void connectToPairedDevice (QString name); + Q_INVOKABLE void removePairedDevice (QString name); #if defined QGC_ENABLE_NFC || defined QGC_ENABLE_QTNFC Q_INVOKABLE void startNFCScan(); @@ -86,8 +91,11 @@ public: Q_PROPERTY(PairingStatus pairingStatus READ pairingStatus NOTIFY pairingStatusChanged) Q_PROPERTY(QStringList pairedDeviceNameList READ pairedDeviceNameList NOTIFY pairedListChanged) Q_PROPERTY(QStringList pairingLinkTypeStrings READ pairingLinkTypeStrings CONSTANT) + Q_PROPERTY(QString pairedVehicle READ pairedVehicle NOTIFY pairedVehicleChanged) + Q_PROPERTY(bool errorState READ errorState NOTIFY pairingStatusChanged) Q_PROPERTY(int nfcIndex READ nfcIndex CONSTANT) Q_PROPERTY(int microhardIndex READ microhardIndex CONSTANT) + Q_PROPERTY(bool firstBoot READ firstBoot WRITE setFirstBoot NOTIFY firstBootChanged) signals: void startUpload(QString pairURL, QJsonDocument); @@ -98,6 +106,8 @@ signals: void parsePairingJson(QString json); void setPairingStatus(PairingStatus status, QString pairingStatus); void pairedListChanged(); + void pairedVehicleChanged(); + void firstBootChanged(); private slots: void _startUpload(QString pairURL, QJsonDocument); @@ -109,6 +119,7 @@ private slots: private: QString _statusString; QString _jsonFileName; + QString _lastPaired; QVariantMap _remotePairingMap; int _nfcIndex = -1; int _microhardIndex = -1; @@ -121,20 +132,21 @@ private: QString _uploadURL{}; QString _uploadData{}; - void _parsePairingJsonFile(); - QJsonDocument _createZeroTierConnectJson(QString cert2); - QJsonDocument _createMicrohardConnectJson(QString cert2); - QJsonDocument _createZeroTierPairingJson(QString cert1); - QJsonDocument _createMicrohardPairingJson(QString pwd, QString cert1); - QString _assumeMicrohardPairingJson(); - void _writeJson(QJsonDocument &jsonDoc, QString fileName); - QString _getLocalIPInNetwork(QString remoteIP, int num); - void _uploadFinished(void); - void _uploadError(QNetworkReply::NetworkError code); - void _pairingCompleted(QString name); - void _connectionCompleted(QString name); - QDir _pairingCacheDir(); - QString _pairingCacheFile(QString uavName); + void _parsePairingJsonFile(); + QJsonDocument _createZeroTierConnectJson(QString cert2); + QJsonDocument _createMicrohardConnectJson(QString cert2); + QJsonDocument _createZeroTierPairingJson(QString cert1); + QJsonDocument _createMicrohardPairingJson(QString pwd, QString cert1); + QString _assumeMicrohardPairingJson(); + void _writeJson(QJsonDocument &jsonDoc, QString fileName); + QString _getLocalIPInNetwork(QString remoteIP, int num); + void _uploadFinished(void); + void _uploadError(QNetworkReply::NetworkError code); + void _pairingCompleted(QString name); + void _connectionCompleted(QString name); + QDir _pairingCacheDir(); + QString _pairingCacheFile(QString uavName); + bool _firstBoot = true; #if defined QGC_ENABLE_NFC || defined QGC_ENABLE_QTNFC PairingNFC pairingNFC; diff --git a/src/ui/preferences/GeneralSettings.qml b/src/ui/preferences/GeneralSettings.qml index d0dc21807577c9eb0b92130a6d1b28735be12ac9..2809c201da091f8410b677f5911b56423502ef05 100644 --- a/src/ui/preferences/GeneralSettings.qml +++ b/src/ui/preferences/GeneralSettings.qml @@ -484,14 +484,14 @@ Rectangle { } FactCheckBox { text: qsTr("Show additional heading indicators on Compass") - visible: _showAdditionalIndicatorsCompass.visible + visible: _showAdditionalIndicatorsCompass ? _showAdditionalIndicatorsCompass.visible : false fact: _showAdditionalIndicatorsCompass property Fact _showAdditionalIndicatorsCompass: QGroundControl.settingsManager.flyViewSettings.showAdditionalIndicatorsCompass } FactCheckBox { text: qsTr("Lock Compass Nose-Up") - visible: _lockNoseUpCompass.visible + visible: _lockNoseUpCompass ? _lockNoseUpCompass.visible : false fact: _lockNoseUpCompass property Fact _lockNoseUpCompass: QGroundControl.settingsManager.flyViewSettings.lockNoseUpCompass diff --git a/src/ui/toolbar/PairingIndicator.qml b/src/ui/toolbar/PairingIndicator.qml index 3d60bb0bf5505a2b2f3aba8c8686a7d681a03e8c..90f6bca04e76fc0e9d90f1bd06b1c23ba9aa04f8 100644 --- a/src/ui/toolbar/PairingIndicator.qml +++ b/src/ui/toolbar/PairingIndicator.qml @@ -10,6 +10,7 @@ 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 @@ -26,24 +27,46 @@ Item { anchors.bottom: parent.bottom property bool _light: qgcPal.globalTheme === QGCPalette.Light && !activeVehicle - property real _contentWidth: ScreenTools.defaultFontPixelWidth * 40 + 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 - Image { + QGCColoredImage { id: pairingIcon height: parent.height width: height - source: _light ? "/qmlimages/PairingIconLight.svg" : "/qmlimages/PairingIcon.svg" + color: qgcPal.text + source: "/qmlimages/PairingIcon.svg" sourceSize.width: width fillMode: Image.PreserveAspectFit smooth: true @@ -62,89 +85,7 @@ Item { MouseArea { anchors.fill: parent onClicked: { - if(QGroundControl.pairingManager.pairedDeviceNameList.length > 1) { - connectionPopup.open() - } else { - if(QGroundControl.pairingManager.pairingLinkTypeStrings.length > 1) - pairingPopup.open() - else { - mhPopup.open() - } - } - } - } - //------------------------------------------------------------------------- - //-- Pairing - Popup { - id: pairingPopup - width: pairingBody.width - height: pairingBody.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: pairingBody - width: comboListCol.width + (ScreenTools.defaultFontPixelWidth * 8) - height: comboListCol.height + (ScreenTools.defaultFontPixelHeight * 2) - anchors.centerIn: parent - Column { - id: comboListCol - spacing: _contentSpacing - anchors.centerIn: parent - Item { width: 1; height: 1; } - QGCLabel { - text: kPairingManager - font.family: ScreenTools.demiboldFontFamily - anchors.horizontalCenter: parent.horizontalCenter - } - 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: "Pair Graphic" - anchors.centerIn: parent - } - } - Item { width: 1; height: 1; } - QGCLabel { - text: qsTr("Please choose a pairing method in order to connect to a nearby device") - width: _contentWidth - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter - anchors.horizontalCenter: parent.horizontalCenter - } - Item { width: 1; height: 1; } - Repeater { - model: QGroundControl.pairingManager ? QGroundControl.pairingManager.pairingLinkTypeStrings : [] - delegate: QGCButton { - text: modelData - width: _contentWidth - anchors.horizontalCenter: parent.horizontalCenter - onClicked: { - pairingPopup.close() - if (index === QGroundControl.pairingManager.nfcIndex) { - nfcPopup.open() - } else if (index === QGroundControl.pairingManager.microhardIndex) { - mhPopup.open() - } - } - } - } - Item { width: 1; height: 1; } - } + runPairing() } } //------------------------------------------------------------------------- @@ -177,37 +118,42 @@ Item { 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 3 times on the button in order to put the vehicle in a discovery mode") + 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: 1; } - Rectangle { - width: _rectWidth - height: _rectHeight - color: Qt.rgba(0,0,0,0) - border.color: qgcPal.text - border.width: 1 + Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 2; } + QGCColoredImage { + height: ScreenTools.defaultFontPixelHeight * 6 + width: height + source: "/qmlimages/PairingButton.svg" + sourceSize.height: height + fillMode: Image.PreserveAspectFit + mipmap: true + smooth: true + color: qgcPal.text anchors.horizontalCenter: parent.horizontalCenter - QGCLabel { - text: "Button Positioning Graphic" - anchors.centerIn: parent - } } - Item { width: 1; height: 1; } + Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 2; } QGCButton { - text: qsTr("Pair Via Microhard") + text: qsTr("Pair a Vehicle") width: _contentWidth anchors.horizontalCenter: parent.horizontalCenter onClicked: { mhPopup.close() - connectionPopup.open() + progressPopup.open() QGroundControl.pairingManager.startMicrohardPairing(); } } @@ -245,8 +191,14 @@ Item { 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 @@ -275,7 +227,7 @@ Item { anchors.horizontalCenter: parent.horizontalCenter onClicked: { nfcPopup.close() - connectionPopup.open() + progressPopup.open() QGroundControl.pairingManager.startNFCScan(); } } @@ -284,11 +236,11 @@ Item { } } //------------------------------------------------------------------------- - //-- Connection Manager + //-- Pairing/Connection Progress Popup { - id: connectionPopup - width: connectionBody.width - height: connectionBody.height + id: progressPopup + width: progressBody.width + height: progressBody.height modal: true focus: true parent: Overlay.overlay @@ -301,22 +253,24 @@ Item { radius: ScreenTools.defaultFontPixelWidth * 0.25 } Item { - id: connectionBody - width: connectionCol.width + (ScreenTools.defaultFontPixelWidth * 8) - height: connectionCol.height + (ScreenTools.defaultFontPixelHeight * 2) + id: progressBody + width: progressCol.width + (ScreenTools.defaultFontPixelWidth * 8) + height: progressCol.height + (ScreenTools.defaultFontPixelHeight * 2) anchors.centerIn: parent Column { - id: connectionCol + 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 { @@ -325,9 +279,11 @@ Item { 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 * 2 + height: ScreenTools.defaultFontPixelHeight * 4 width: height source: "/qmlimages/MapSync.svg" sourceSize.height: height @@ -335,7 +291,7 @@ Item { mipmap: true smooth: true color: qgcPal.text - visible: cancelButton.visible + visible: QGroundControl.pairingManager.pairingStatus === PairingManager.PairingActive || QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnecting anchors.horizontalCenter: parent.horizontalCenter RotationAnimation on rotation { loops: Animation.Infinite @@ -345,6 +301,132 @@ Item { running: busyIndicator.visible } } + Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 3; visible: busyIndicator.visible; } + //-- Error State + Image { + height: ScreenTools.defaultFontPixelHeight * 4 + width: height + source: "/qmlimages/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: "/qmlimages/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 @@ -358,9 +440,9 @@ Item { rowSpacing: ScreenTools.defaultFontPixelHeight * 0.25 anchors.horizontalCenter: parent.horizontalCenter Repeater { - model: QGroundControl.pairingManager ? QGroundControl.pairingManager.pairedDeviceNameList : [] + model: QGroundControl.pairingManager ? QGroundControl.pairingManager.pairedDeviceNameList : [] QGCLabel { - text: modelData + text: modelData Layout.row: index Layout.column: 0 Layout.minimumWidth:ScreenTools.defaultFontPixelWidth * 14 @@ -368,18 +450,20 @@ Item { } } Repeater { - model: QGroundControl.pairingManager ? QGroundControl.pairingManager.pairedDeviceNameList : [] + model: QGroundControl.pairingManager ? QGroundControl.pairingManager.pairedDeviceNameList : [] QGCButton { text: qsTr("Connect") Layout.row: index Layout.column: 1 onClicked: { QGroundControl.pairingManager.connectToPairedDevice(modelData) + connectionPopup.close() + progressPopup.open() } } } Repeater { - model: QGroundControl.pairingManager ? QGroundControl.pairingManager.pairedDeviceNameList : [] + model: QGroundControl.pairingManager ? QGroundControl.pairingManager.pairedDeviceNameList : [] QGCColoredImage { height: ScreenTools.defaultFontPixelHeight * 1.5 width: height @@ -391,7 +475,18 @@ Item { MouseArea { anchors.fill: parent onClicked: { - //-- TODO: + 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() } } } @@ -399,10 +494,8 @@ Item { } Item { width: 1; height: _contentSpacing; } QGCButton { - id: connectedButton width: _contentWidth - visible: QGroundControl.pairingManager ? (QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnected || QGroundControl.pairingManager.pairingStatus === PairingManager.PairingIdle) : false - text: QGroundControl.pairingManager ? (QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnected ? qsTr("Done ") : qsTr("Close")) : "" + text: qsTr("Close") anchors.horizontalCenter: parent.horizontalCenter onClicked: { connectionPopup.close() @@ -411,39 +504,10 @@ Item { QGCButton { text: qsTr("Pair Another") width: _contentWidth - visible: connectedButton.visible - anchors.horizontalCenter: parent.horizontalCenter - onClicked: { - connectionPopup.close() - if(QGroundControl.pairingManager.pairingLinkTypeStrings.length > 1) - pairingPopup.open() - else { - mhPopup.open() - } - } - } - QGCButton { - id: cancelButton - width: _contentWidth - visible: QGroundControl.pairingManager ? (QGroundControl.pairingManager.pairingStatus === PairingManager.PairingActive || QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnecting) : 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 - } - connectionPopup.close() - } - } - QGCButton { - visible: !cancelButton.visible && !connectedButton.visible - text: qsTr("Close") - width: _contentWidth anchors.horizontalCenter: parent.horizontalCenter onClicked: { connectionPopup.close() + mhPopup.open() } } Item { width: 1; height: 1; }