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 <QApplication>
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<osgViewer::CompositeViewer> viewer;
osg::ref_ptr<osgViewer::View> 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<osgViewer::CompositeViewer> viewer;
osg::ref_ptr<osgViewer::View> 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";

View File

@ -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);

View File

@ -18,6 +18,7 @@
* along with LibrePilot GCS. If not, see <http://www.gnu.org/licenses/>.
*/
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
}
}

View File

@ -18,6 +18,7 @@
* along with LibrePilot GCS. If not, see <http://www.gnu.org/licenses/>.
*/
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
}
}