From 2fa10f5f4e4a694d1e2e2d246b4d92638d85c668 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Tue, 14 Apr 2015 14:30:48 -0700 Subject: [PATCH] New Qml based dock widget support --- src/ViewWidgets/ViewWidget.qml | 82 +++++++++++++++++++++++++ src/ViewWidgets/ViewWidgetController.cc | 74 ++++++++++++++++++++++ src/ViewWidgets/ViewWidgetController.h | 56 +++++++++++++++++ 3 files changed, 212 insertions(+) create mode 100644 src/ViewWidgets/ViewWidget.qml create mode 100644 src/ViewWidgets/ViewWidgetController.cc create mode 100644 src/ViewWidgets/ViewWidgetController.h diff --git a/src/ViewWidgets/ViewWidget.qml b/src/ViewWidgets/ViewWidget.qml new file mode 100644 index 000000000..aab2e57cc --- /dev/null +++ b/src/ViewWidgets/ViewWidget.qml @@ -0,0 +1,82 @@ +import QtQuick 2.2 +import QtQuick.Controls 1.2 +import QtQuick.Controls.Styles 1.2 + +import QGroundControl.Palette 1.0 +import QGroundControl.Controllers 1.0 + +Rectangle { + property Component connectedComponent: __componentConnected + property Component disconnectedComponent: __componentDisconnected + + QGCPalette { id: __qgcPal; colorGroupEnabled: enabled } + ViewWidgetController { id: __controller } + + color: __qgcPal.window + + Component.onCompleted: __controller.checkForVehicle() + + Connections { + target: __controller + + onPluginConnected: { + pageLoader.autopilot = autopilot + pageLoader.sourceComponent = connectedComponent + } + + onPluginDisconnected: { + pageLoader.sourceComponent = disconnectedComponent + pageLoader.autopilot = {} + } + } + + Loader { + id: pageLoader + + anchors.fill: parent + + property var autopilot + + sourceComponent: __componentDisconnected + } + + Component { + id: __componentConnected + + Rectangle { + QGCPalette { id: __qgcPal; colorGroupEnabled: enabled } + + anchors.fill: parent + color: __qgcPal.window + + QGCLabel { + anchors.fill: parent + + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + + text: "missing connected implementation" + } + } + } + + Component { + id: __componentDisconnected + + Rectangle { + QGCPalette { id: __qgcPal; colorGroupEnabled: enabled } + + anchors.fill: parent + color: __qgcPal.window + + QGCLabel { + anchors.fill: parent + + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + + text: "no vehicle connected" + } + } + } +} diff --git a/src/ViewWidgets/ViewWidgetController.cc b/src/ViewWidgets/ViewWidgetController.cc new file mode 100644 index 000000000..cad1626cf --- /dev/null +++ b/src/ViewWidgets/ViewWidgetController.cc @@ -0,0 +1,74 @@ +/*===================================================================== + + QGroundControl Open Source Ground Control Station + + (c) 2009 - 2014 QGROUNDCONTROL PROJECT + + This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + QGROUNDCONTROL is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QGROUNDCONTROL. If not, see . + + ======================================================================*/ + +#include "ViewWidgetController.h" +#include "UASManager.h" +#include "AutoPilotPluginManager.h" + +ViewWidgetController::ViewWidgetController(void) : + _autopilot(NULL) +{ + _uasManager = UASManager::instance(); + Q_ASSERT(_uasManager); + + connect(_uasManager, &UASManagerInterface::activeUASSet, this, &ViewWidgetController::_activeUasChanged); +} + +void ViewWidgetController::_activeUasChanged(UASInterface* currentUas) +{ + if (currentUas != _uas) { + if (_uas) { + disconnect(_autopilot, &AutoPilotPlugin::pluginReadyChanged, this, &ViewWidgetController::_pluginReadyChanged); + _uas = NULL; + _autopilot = NULL; + emit pluginDisconnected(); + } + + if (currentUas) { + _uas = currentUas; + _autopilot = AutoPilotPluginManager::instance()->getInstanceForAutoPilotPlugin(currentUas); + Q_ASSERT(_autopilot); + + connect(_autopilot, &AutoPilotPlugin::pluginReadyChanged, this, &ViewWidgetController::_pluginReadyChanged); + if (_autopilot->pluginReady()) { + _pluginReadyChanged(true); + } + } + } +} + +void ViewWidgetController::_pluginReadyChanged(bool pluginReady) +{ + Q_ASSERT(_autopilot); + + if (pluginReady) { + emit pluginConnected(QVariant::fromValue(_autopilot)); + } else { + _activeUasChanged(NULL); + } +} + +Q_INVOKABLE void ViewWidgetController::checkForVehicle(void) +{ + _activeUasChanged(_uasManager->getActiveUAS()); +} diff --git a/src/ViewWidgets/ViewWidgetController.h b/src/ViewWidgets/ViewWidgetController.h new file mode 100644 index 000000000..63a73f00d --- /dev/null +++ b/src/ViewWidgets/ViewWidgetController.h @@ -0,0 +1,56 @@ +/*===================================================================== + + QGroundControl Open Source Ground Control Station + + (c) 2009 - 2014 QGROUNDCONTROL PROJECT + + This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + QGROUNDCONTROL is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QGROUNDCONTROL. If not, see . + + ======================================================================*/ + +#ifndef VIEWWIDGETCONTROLLER_H +#define VIEWWIDGETCONTROLLER_H + +#include + +#include "UASInterface.h" +#include "AutoPilotPlugin.h" +#include "UASManagerInterface.h" + +class ViewWidgetController : public QObject +{ + Q_OBJECT + +public: + ViewWidgetController(void); + + Q_INVOKABLE void checkForVehicle(void); + +signals: + void pluginConnected(QVariant autopilot); + void pluginDisconnected(void); + +private slots: + void _activeUasChanged(UASInterface* UAS); + void _pluginReadyChanged(bool pluginReady); + +private: + AutoPilotPlugin* _autopilot; + UASManagerInterface* _uasManager; + UASInterface* _uas; +}; + +#endif \ No newline at end of file -- 2.22.0