1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-03-15 07:29:15 +01:00

LP-29 add OSGViewport busy indicator

spins when database pager requests are in progress
This commit is contained in:
Philippe Renon 2016-03-12 20:12:34 +01:00
parent 2c7333935d
commit 2e0f10d982
4 changed files with 124 additions and 58 deletions

View File

@ -58,7 +58,6 @@
#include <QThread> #include <QThread>
#include <QApplication> #include <QApplication>
namespace osgQtQuick {
/* /*
Debugging tips Debugging tips
- export OSG_NOTIFY_LEVEL=DEBUG - export OSG_NOTIFY_LEVEL=DEBUG
@ -79,18 +78,44 @@ namespace osgQtQuick {
TODO : add OSGView to handle multiple views for a given OSGViewport TODO : add OSGView to handle multiple views for a given OSGViewport
*/ */
namespace osgQtQuick {
class ViewportRenderer;
struct OSGViewport::Hidden : public QObject { struct OSGViewport::Hidden : public QObject {
Q_OBJECT Q_OBJECT
friend ViewportRenderer;
OSGViewport *self;
QQuickWindow *window;
int frameTimer;
public:
OSGNode *sceneData;
OSGCamera *camera;
osg::ref_ptr<osgViewer::CompositeViewer> viewer;
osg::ref_ptr<osgViewer::View> view;
UpdateMode::Enum updateMode;
bool busy;
static QtKeyboardMap keyMap;
public: public:
Hidden(OSGViewport *viewport) : QObject(viewport), Hidden(OSGViewport *viewport) : QObject(viewport),
self(viewport), self(viewport),
window(NULL), window(NULL),
frameTimer(-1),
sceneData(NULL), sceneData(NULL),
camera(NULL), camera(NULL),
updateMode(UpdateMode::Discrete), updateMode(UpdateMode::Discrete),
frameTimer(-1) busy(false)
{ {
OsgEarth::initialize(); OsgEarth::initialize();
@ -274,22 +299,7 @@ public:
return true; return true;
} }
OSGViewport *self; private:
QQuickWindow *window;
OSGNode *sceneData;
OSGCamera *camera;
UpdateMode::Enum updateMode;
int frameTimer;
osg::ref_ptr<osgViewer::CompositeViewer> viewer;
osg::ref_ptr<osgViewer::View> view;
static QtKeyboardMap keyMap;
void createViewer() void createViewer()
{ {
if (viewer.valid()) { if (viewer.valid()) {
@ -511,10 +521,15 @@ public:
h->view->getCamera()->getGraphicsContext()->resized(0, 0, item->width() * dpr, item->height() * dpr); 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) { if (!needToDoFrame) {
needToDoFrame = h->viewer->checkNeedToDoFrame(); needToDoFrame = h->viewer->checkNeedToDoFrame();
} }
if (!needToDoFrame) { if (!needToDoFrame) {
// calling checkNeedToDoFrame is not enough...
needToDoFrame = !h->view->getEventQueue()->empty(); needToDoFrame = !h->view->getEventQueue()->empty();
} }
if (needToDoFrame) { if (needToDoFrame) {
@ -592,35 +607,6 @@ OSGViewport::~OSGViewport()
delete h; 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() OSGNode *OSGViewport::sceneData()
{ {
return h->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 QQuickFramebufferObject::Renderer *OSGViewport::createRenderer() const
{ {
qDebug() << "OSGViewport::createRenderer"; qDebug() << "OSGViewport::createRenderer";

View File

@ -49,10 +49,11 @@ public:
}; };
class OSGQTQUICK_EXPORT OSGViewport : public QQuickFramebufferObject { class OSGQTQUICK_EXPORT OSGViewport : public QQuickFramebufferObject {
Q_OBJECT Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) Q_OBJECT Q_PROPERTY(osgQtQuick::OSGNode *sceneData READ sceneData WRITE setSceneData NOTIFY sceneDataChanged)
Q_PROPERTY(osgQtQuick::UpdateMode::Enum updateMode READ updateMode WRITE setUpdateMode NOTIFY updateModeChanged)
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::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: public:
friend class ViewportRenderer; friend class ViewportRenderer;
@ -60,26 +61,30 @@ public:
explicit OSGViewport(QQuickItem *parent = 0); explicit OSGViewport(QQuickItem *parent = 0);
virtual ~OSGViewport(); virtual ~OSGViewport();
UpdateMode::Enum updateMode() const;
void setUpdateMode(UpdateMode::Enum mode);
QColor color() const;
void setColor(const QColor &color);
OSGNode *sceneData(); OSGNode *sceneData();
void setSceneData(OSGNode *node); void setSceneData(OSGNode *node);
OSGCamera *camera(); OSGCamera *camera();
void setCamera(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; Renderer *createRenderer() const;
void releaseResources(); void releaseResources();
signals: signals:
void updateModeChanged(UpdateMode::Enum mode);
void colorChanged(const QColor &color);
void sceneDataChanged(OSGNode *node); void sceneDataChanged(OSGNode *node);
void cameraChanged(OSGCamera *camera); void cameraChanged(OSGCamera *camera);
void updateModeChanged(UpdateMode::Enum mode);
void busyChanged(bool busy);
void colorChanged(const QColor &color);
protected: protected:
void mousePressEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event);

View File

@ -18,6 +18,7 @@
* along with LibrePilot GCS. If not, see <http://www.gnu.org/licenses/>. * along with LibrePilot GCS. If not, see <http://www.gnu.org/licenses/>.
*/ */
import QtQuick 2.4 import QtQuick 2.4
import QtQuick.Controls 1.4
import Pfd 1.0 import Pfd 1.0
import OsgQtQuick 1.0 import OsgQtQuick 1.0
@ -26,6 +27,7 @@ import "common.js" as Utils
Item { Item {
OSGViewport { OSGViewport {
id: osgViewport
anchors.fill: parent anchors.fill: parent
focus: true focus: true
sceneData: skyNode sceneData: skyNode
@ -50,5 +52,23 @@ Item {
manipulatorMode: ManipulatorMode.Earth 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
} }
} }

View File

@ -18,6 +18,7 @@
* along with LibrePilot GCS. If not, see <http://www.gnu.org/licenses/>. * along with LibrePilot GCS. If not, see <http://www.gnu.org/licenses/>.
*/ */
import QtQuick 2.4 import QtQuick 2.4
import QtQuick.Controls 1.4
import Pfd 1.0 import Pfd 1.0
import OsgQtQuick 1.0 import OsgQtQuick 1.0
@ -26,6 +27,7 @@ import "../common.js" as Utils
import "../uav.js" as UAV import "../uav.js" as UAV
OSGViewport { OSGViewport {
id: osgViewport
anchors.fill: parent anchors.fill: parent
focus: true focus: true
sceneData: skyNode sceneData: skyNode
@ -97,4 +99,15 @@ OSGViewport {
Keys.onDownPressed: { Keys.onDownPressed: {
pfdContext.previousModel(); pfdContext.previousModel();
} }
BusyIndicator {
width: 24
height: 24
anchors.right: parent.right
anchors.top: parent.top
anchors.margins: 4
running: osgViewport.busy
}
} }