#include "qquickmapboxglrenderer.hpp" #include #include #include #include #include #include #include #include QQuickMapboxGL::QQuickMapboxGL(QQuickItem *parent_) : QQuickFramebufferObject(parent_) { } QQuickMapboxGL::~QQuickMapboxGL() { } QQuickFramebufferObject::Renderer *QQuickMapboxGL::createRenderer() const { return new QQuickMapboxGLRenderer; } void QQuickMapboxGL::setPlugin(QDeclarativeGeoServiceProvider *) { qWarning() << __PRETTY_FUNCTION__ << "Not implemented."; } QDeclarativeGeoServiceProvider *QQuickMapboxGL::plugin() const { return nullptr; } void QQuickMapboxGL::setMinimumZoomLevel(qreal zoom) { zoom = qMax(mbgl::util::MIN_ZOOM, zoom); zoom = qMin(m_maximumZoomLevel, zoom); if (m_minimumZoomLevel == zoom) { return; } m_minimumZoomLevel = zoom; setZoomLevel(m_zoomLevel); // Constrain. emit minimumZoomLevelChanged(); } qreal QQuickMapboxGL::minimumZoomLevel() const { return m_minimumZoomLevel; } void QQuickMapboxGL::setMaximumZoomLevel(qreal zoom) { zoom = qMin(mbgl::util::MAX_ZOOM, zoom); zoom = qMax(m_minimumZoomLevel, zoom); if (m_maximumZoomLevel == zoom) { return; } m_maximumZoomLevel = zoom; setZoomLevel(m_zoomLevel); // Constrain. emit maximumZoomLevelChanged(); } qreal QQuickMapboxGL::maximumZoomLevel() const { return m_maximumZoomLevel; } void QQuickMapboxGL::setZoomLevel(qreal zoom) { zoom = qMin(m_maximumZoomLevel, zoom); zoom = qMax(m_minimumZoomLevel, zoom); if (m_zoomLevel == zoom) { return; } m_zoomLevel = zoom; m_syncState |= ZoomNeedsSync; update(); emit zoomLevelChanged(m_zoomLevel); } qreal QQuickMapboxGL::zoomLevel() const { return m_zoomLevel; } void QQuickMapboxGL::setCenter(const QGeoCoordinate &coordinate) { if (m_center == coordinate) { return; } m_center = coordinate; m_syncState |= CenterNeedsSync; update(); emit centerChanged(m_center); } QGeoCoordinate QQuickMapboxGL::center() const { return m_center; } QGeoServiceProvider::Error QQuickMapboxGL::error() const { return QGeoServiceProvider::NoError; } QString QQuickMapboxGL::errorString() const { return QString(); } void QQuickMapboxGL::setVisibleRegion(const QGeoShape &shape) { m_visibleRegion = shape; } QGeoShape QQuickMapboxGL::visibleRegion() const { return m_visibleRegion; } void QQuickMapboxGL::setCopyrightsVisible(bool) { qWarning() << __PRETTY_FUNCTION__ << "Not implemented."; } bool QQuickMapboxGL::copyrightsVisible() const { return false; } void QQuickMapboxGL::setColor(const QColor &color) { if (m_color == color) { return; } m_color = color; QVariantMap paintProperty; paintProperty["type"] = QQuickMapboxGLLayoutStyleProperty::PaintType; paintProperty["layer"] = "background"; paintProperty["property"] = "background-color"; paintProperty["value"] = color; onStylePropertyUpdated(paintProperty); emit colorChanged(m_color); } QColor QQuickMapboxGL::color() const { return m_color; } void QQuickMapboxGL::pan(int dx, int dy) { m_pan += QPointF(dx, -dy); m_syncState |= PanNeedsSync; update(); } void QQuickMapboxGL::setStyle(QQuickMapboxGLStyle *style) { if (style == m_style) { return; } disconnect(style, SIGNAL(urlChanged(QString)), this, SLOT(onStyleChanged())); disconnect(style, SIGNAL(propertyUpdated(QVariantMap)), this, SLOT(onStylePropertyUpdated(QVariantMap))); delete m_style; m_style = style; if (style) { style->setParentItem(this); connect(style, SIGNAL(urlChanged(QString)), this, SLOT(onStyleChanged())); connect(style, SIGNAL(propertyUpdated(QVariantMap)), this, SLOT(onStylePropertyUpdated(QVariantMap))); } m_syncState |= StyleNeedsSync; m_styleLoaded = false; update(); emit styleChanged(); } QQuickMapboxGLStyle *QQuickMapboxGL::style() const { return m_style; } void QQuickMapboxGL::setBearing(qreal angle) { angle = std::fmod(angle, 360.); if (m_bearing == angle) { return; } m_bearing = angle; m_syncState |= BearingNeedsSync; update(); emit bearingChanged(m_bearing); } 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; } void QQuickMapboxGL::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value) { QQuickFramebufferObject::itemChange(change, value); switch (change) { case QQuickItem::ItemChildAddedChange: if (QQuickMapboxGLStyleProperty *property = qobject_cast(value.item)) { connect(property, SIGNAL(updated(QVariantMap)), this, SLOT(onStylePropertyUpdated(QVariantMap))); connect(this, SIGNAL(styleChanged()), property, SLOT(checkUpdated())); } break; case QQuickItem::ItemChildRemovedChange: if (QQuickMapboxGLStyleProperty *property = qobject_cast(value.item)) { disconnect(property, SIGNAL(updated(QVariantMap)), this, SLOT(onStylePropertyUpdated(QVariantMap))); disconnect(this, SIGNAL(styleChanged()), property, SLOT(checkUpdated())); } default: break; } } void QQuickMapboxGL::onMapChanged(QMapbox::MapChange change) { if (change == QMapbox::MapChangeDidFinishLoadingStyle) { m_styleLoaded = true; update(); } } void QQuickMapboxGL::onStylePropertyUpdated(const QVariantMap ¶ms) { switch (params.value("type").toInt()) { case QQuickMapboxGLStyleProperty::LayoutType: m_layoutChanges << params; break; case QQuickMapboxGLStyleProperty::PaintType: m_paintChanges << params; break; } update(); } void QQuickMapboxGL::onStyleChanged() { m_syncState |= StyleNeedsSync; update(); emit styleChanged(); }