From 2e0f10d982f7ebf53dd1017484bf3f1ded3474e9 Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Sat, 12 Mar 2016 20:12:34 +0100 Subject: [PATCH] LP-29 add OSGViewport busy indicator spins when database pager requests are in progress --- .../libs/osgearth/osgQtQuick/OSGViewport.cpp | 122 +++++++++++------- .../libs/osgearth/osgQtQuick/OSGViewport.hpp | 27 ++-- ground/gcs/src/share/qml/EarthView.qml | 20 +++ .../src/share/qml/model/ModelTerrainView.qml | 13 ++ 4 files changed, 124 insertions(+), 58 deletions(-) diff --git a/ground/gcs/src/libs/osgearth/osgQtQuick/OSGViewport.cpp b/ground/gcs/src/libs/osgearth/osgQtQuick/OSGViewport.cpp index 425e28bf0..7ebfe48ee 100644 --- a/ground/gcs/src/libs/osgearth/osgQtQuick/OSGViewport.cpp +++ b/ground/gcs/src/libs/osgearth/osgQtQuick/OSGViewport.cpp @@ -58,7 +58,6 @@ #include #include -namespace osgQtQuick { /* Debugging tips - export OSG_NOTIFY_LEVEL=DEBUG @@ -79,18 +78,44 @@ namespace osgQtQuick { TODO : add OSGView to handle multiple views for a given OSGViewport */ + +namespace osgQtQuick { +class ViewportRenderer; + struct OSGViewport::Hidden : public QObject { Q_OBJECT + friend ViewportRenderer; + + OSGViewport *self; + + QQuickWindow *window; + + int frameTimer; + +public: + OSGNode *sceneData; + OSGCamera *camera; + + osg::ref_ptr viewer; + osg::ref_ptr view; + + UpdateMode::Enum updateMode; + + bool busy; + + static QtKeyboardMap keyMap; + public: Hidden(OSGViewport *viewport) : QObject(viewport), self(viewport), window(NULL), + frameTimer(-1), sceneData(NULL), camera(NULL), updateMode(UpdateMode::Discrete), - frameTimer(-1) + busy(false) { OsgEarth::initialize(); @@ -274,22 +299,7 @@ public: return true; } - OSGViewport *self; - - QQuickWindow *window; - - OSGNode *sceneData; - OSGCamera *camera; - - UpdateMode::Enum updateMode; - - int frameTimer; - - osg::ref_ptr viewer; - osg::ref_ptr view; - - static QtKeyboardMap keyMap; - +private: void createViewer() { if (viewer.valid()) { @@ -511,10 +521,15 @@ public: h->view->getCamera()->getGraphicsContext()->resized(0, 0, item->width() * dpr, item->height() * dpr); } + h->self->setBusy(h->view->getDatabasePager()->getRequestsInProgress()); + // TODO also expose request list size to Qml + // qDebug() << h->view->getDatabasePager()->getFileRequestListSize(); + if (!needToDoFrame) { needToDoFrame = h->viewer->checkNeedToDoFrame(); } if (!needToDoFrame) { + // calling checkNeedToDoFrame is not enough... needToDoFrame = !h->view->getEventQueue()->empty(); } if (needToDoFrame) { @@ -592,35 +607,6 @@ OSGViewport::~OSGViewport() delete h; } -UpdateMode::Enum OSGViewport::updateMode() const -{ - return h->updateMode; -} - -void OSGViewport::setUpdateMode(UpdateMode::Enum mode) -{ - if (h->acceptUpdateMode(mode)) { - emit updateModeChanged(updateMode()); - } -} - -QColor OSGViewport::color() const -{ - const osg::Vec4 osgColor = h->view->getCamera()->getClearColor(); - - return QColor::fromRgbF(osgColor.r(), osgColor.g(), osgColor.b(), osgColor.a()); -} - -void OSGViewport::setColor(const QColor &color) -{ - osg::Vec4 osgColor(color.redF(), color.greenF(), color.blueF(), color.alphaF()); - - if (h->view->getCamera()->getClearColor() != osgColor) { - h->view->getCamera()->setClearColor(osgColor); - emit colorChanged(color); - } -} - OSGNode *OSGViewport::sceneData() { return h->sceneData; @@ -645,6 +631,48 @@ void OSGViewport::setCamera(OSGCamera *camera) } } +UpdateMode::Enum OSGViewport::updateMode() const +{ + return h->updateMode; +} + +void OSGViewport::setUpdateMode(UpdateMode::Enum mode) +{ + if (h->acceptUpdateMode(mode)) { + emit updateModeChanged(updateMode()); + } +} + +bool OSGViewport::busy() const +{ + return h->busy; +} + +void OSGViewport::setBusy(const bool busy) +{ + if (h->busy != busy) { + h->busy = busy; + emit busyChanged(busy); + } +} + +QColor OSGViewport::color() const +{ + const osg::Vec4 osgColor = h->view->getCamera()->getClearColor(); + + return QColor::fromRgbF(osgColor.r(), osgColor.g(), osgColor.b(), osgColor.a()); +} + +void OSGViewport::setColor(const QColor &color) +{ + osg::Vec4 osgColor(color.redF(), color.greenF(), color.blueF(), color.alphaF()); + + if (h->view->getCamera()->getClearColor() != osgColor) { + h->view->getCamera()->setClearColor(osgColor); + emit colorChanged(color); + } +} + QQuickFramebufferObject::Renderer *OSGViewport::createRenderer() const { qDebug() << "OSGViewport::createRenderer"; diff --git a/ground/gcs/src/libs/osgearth/osgQtQuick/OSGViewport.hpp b/ground/gcs/src/libs/osgearth/osgQtQuick/OSGViewport.hpp index 4b32398b4..c6fb76e2d 100644 --- a/ground/gcs/src/libs/osgearth/osgQtQuick/OSGViewport.hpp +++ b/ground/gcs/src/libs/osgearth/osgQtQuick/OSGViewport.hpp @@ -49,10 +49,11 @@ public: }; class OSGQTQUICK_EXPORT OSGViewport : public QQuickFramebufferObject { - Q_OBJECT Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) - Q_PROPERTY(osgQtQuick::UpdateMode::Enum updateMode READ updateMode WRITE setUpdateMode NOTIFY updateModeChanged) - Q_PROPERTY(osgQtQuick::OSGNode * sceneData READ sceneData WRITE setSceneData NOTIFY sceneDataChanged) + Q_OBJECT Q_PROPERTY(osgQtQuick::OSGNode *sceneData READ sceneData WRITE setSceneData NOTIFY sceneDataChanged) Q_PROPERTY(osgQtQuick::OSGCamera * camera READ camera WRITE setCamera NOTIFY cameraChanged) + Q_PROPERTY(osgQtQuick::UpdateMode::Enum updateMode READ updateMode WRITE setUpdateMode NOTIFY updateModeChanged) + Q_PROPERTY(bool busy READ busy NOTIFY busyChanged) + Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) public: friend class ViewportRenderer; @@ -60,26 +61,30 @@ public: explicit OSGViewport(QQuickItem *parent = 0); virtual ~OSGViewport(); - UpdateMode::Enum updateMode() const; - void setUpdateMode(UpdateMode::Enum mode); - - QColor color() const; - void setColor(const QColor &color); - OSGNode *sceneData(); void setSceneData(OSGNode *node); OSGCamera *camera(); void setCamera(OSGCamera *camera); + UpdateMode::Enum updateMode() const; + void setUpdateMode(UpdateMode::Enum mode); + + bool busy() const; + void setBusy(const bool busy); + + QColor color() const; + void setColor(const QColor &color); + Renderer *createRenderer() const; void releaseResources(); signals: - void updateModeChanged(UpdateMode::Enum mode); - void colorChanged(const QColor &color); void sceneDataChanged(OSGNode *node); void cameraChanged(OSGCamera *camera); + void updateModeChanged(UpdateMode::Enum mode); + void busyChanged(bool busy); + void colorChanged(const QColor &color); protected: void mousePressEvent(QMouseEvent *event); diff --git a/ground/gcs/src/share/qml/EarthView.qml b/ground/gcs/src/share/qml/EarthView.qml index 97cd5cc88..4622db30d 100644 --- a/ground/gcs/src/share/qml/EarthView.qml +++ b/ground/gcs/src/share/qml/EarthView.qml @@ -18,6 +18,7 @@ * along with LibrePilot GCS. If not, see . */ import QtQuick 2.4 +import QtQuick.Controls 1.4 import Pfd 1.0 import OsgQtQuick 1.0 @@ -26,6 +27,7 @@ import "common.js" as Utils Item { OSGViewport { + id: osgViewport anchors.fill: parent focus: true sceneData: skyNode @@ -50,5 +52,23 @@ Item { manipulatorMode: ManipulatorMode.Earth } + BusyIndicator { + width: 24 + height: 24 + anchors.right: parent.right + anchors.top: parent.top + anchors.margins: 4 + + running: osgViewport.busy + } + + BusyIndicator { + width: 24 + height: 24 + anchors.right: parent.right + anchors.top: parent.top + anchors.margins: 4 + + running: osgViewport.busy } } diff --git a/ground/gcs/src/share/qml/model/ModelTerrainView.qml b/ground/gcs/src/share/qml/model/ModelTerrainView.qml index c6d15e86d..8575b43d1 100644 --- a/ground/gcs/src/share/qml/model/ModelTerrainView.qml +++ b/ground/gcs/src/share/qml/model/ModelTerrainView.qml @@ -18,6 +18,7 @@ * along with LibrePilot GCS. If not, see . */ import QtQuick 2.4 +import QtQuick.Controls 1.4 import Pfd 1.0 import OsgQtQuick 1.0 @@ -26,6 +27,7 @@ import "../common.js" as Utils import "../uav.js" as UAV OSGViewport { + id: osgViewport anchors.fill: parent focus: true sceneData: skyNode @@ -97,4 +99,15 @@ OSGViewport { Keys.onDownPressed: { pfdContext.previousModel(); } + + BusyIndicator { + width: 24 + height: 24 + anchors.right: parent.right + anchors.top: parent.top + anchors.margins: 4 + + running: osgViewport.busy + } + }