[Qt] Add pitch property to QML MapboxGL Type

This commit is contained in:
Thiago Marcos P. Santos
2016-05-02 23:54:43 +03:00
parent 7aa0a88c64
commit a60f401e5a
3 changed files with 40 additions and 6 deletions

View File

@@ -30,6 +30,7 @@ class Q_DECL_EXPORT QQuickMapboxGL : public QQuickFramebufferObject
// MapboxGL QML Type interface.
Q_PROPERTY(QString style READ style WRITE setStyle NOTIFY styleChanged)
Q_PROPERTY(qreal bearing READ bearing WRITE setBearing NOTIFY bearingChanged)
Q_PROPERTY(qreal pitch READ pitch WRITE setPitch NOTIFY pitchChanged)
public:
QQuickMapboxGL(QQuickItem *parent = 0);
@@ -74,15 +75,19 @@ public:
void setBearing(qreal bearing);
qreal bearing() const;
void setPitch(qreal pitch);
qreal pitch() const;
QPointF swapPan();
enum SyncState {
NothingNeedsSync = 0x00,
ZoomNeedsSync = 0x01,
CenterNeedsSync = 0x02,
StyleNeedsSync = 0x04,
PanNeedsSync = 0x08,
BearingNeedsSync = 0x16,
NothingNeedsSync = 0,
ZoomNeedsSync = 1 << 0,
CenterNeedsSync = 1 << 1,
StyleNeedsSync = 1 << 2,
PanNeedsSync = 1 << 3,
BearingNeedsSync = 1 << 4,
PitchNeedsSync = 1 << 5,
};
int swapSyncState();
@@ -102,6 +107,7 @@ signals:
void styleChanged();
void bearingChanged(qreal angle);
void pitchChanged(qreal angle);
public slots:
void setCenter(const QGeoCoordinate &center);
@@ -118,6 +124,7 @@ private:
QString m_style;
qreal m_bearing = 0;
qreal m_pitch = 0;
int m_syncState = NothingNeedsSync;
};

View File

@@ -1,5 +1,7 @@
#include "qquickmapboxglrenderer.hpp"
#include <mbgl/util/constants.hpp>
#include <QQuickMapboxGL>
#include <QQuickItem>
@@ -209,6 +211,27 @@ qreal QQuickMapboxGL::bearing() const
return m_bearing;
}
void QQuickMapboxGL::setPitch(qreal angle)
{
angle = qMin(qMax(0., angle), mbgl::util::PITCH_MAX * mbgl::util::RAD2DEG);
if (m_pitch == angle) {
return;
}
m_pitch = angle;
m_syncState |= PitchNeedsSync;
update();
emit pitchChanged(m_pitch);
}
qreal QQuickMapboxGL::pitch() const
{
return m_pitch;
}
QPointF QQuickMapboxGL::swapPan()
{
QPointF oldPan = m_pan;

View File

@@ -74,4 +74,8 @@ void QQuickMapboxGLRenderer::synchronize(QQuickFramebufferObject *item)
if (syncStatus & QQuickMapboxGL::BearingNeedsSync) {
m_map->setBearing(quickMap->bearing());
}
if (syncStatus & QQuickMapboxGL::PitchNeedsSync) {
m_map->setPitch(quickMap->pitch());
}
}