diff options
Diffstat (limited to 'src/location/declarativemaps/qdeclarativerectanglemapitem.cpp')
-rw-r--r-- | src/location/declarativemaps/qdeclarativerectanglemapitem.cpp | 409 |
1 files changed, 0 insertions, 409 deletions
diff --git a/src/location/declarativemaps/qdeclarativerectanglemapitem.cpp b/src/location/declarativemaps/qdeclarativerectanglemapitem.cpp deleted file mode 100644 index b7d01150..00000000 --- a/src/location/declarativemaps/qdeclarativerectanglemapitem.cpp +++ /dev/null @@ -1,409 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2022 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtLocation module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qdeclarativerectanglemapitem_p.h" -#include "qdeclarativerectanglemapitem_p_p.h" -#include "qdeclarativepolygonmapitem_p.h" - -#include <QtCore/QScopedValueRollback> -#include <QPainterPath> -#include <qnumeric.h> -#include <QRectF> -#include <QPointF> - -#include <QtLocation/private/qgeomap_p.h> -#include <QtPositioning/private/qlocationutils_p.h> -#include <QtPositioning/private/qwebmercator_p.h> -#include <QtPositioning/private/qdoublevector2d_p.h> - -QT_BEGIN_NAMESPACE - -/*! - \qmltype MapRectangle - \instantiates QDeclarativeRectangleMapItem - \inqmlmodule QtLocation - \ingroup qml-QtLocation5-maps - \since QtLocation 5.5 - - \brief The MapRectangle type displays a rectangle on a Map. - - The MapRectangle type displays a rectangle on a Map. Rectangles are a - special case of Polygon with exactly 4 vertices and 4 "straight" edges. In - this case, "straight" means that the top-left point has the same latitude - as the top-right point (the top edge), and the bottom-left point has the - same latitude as the bottom-right point (the bottom edge). Similarly, the - points on the left side have the same longitude, and the points on the - right side have the same longitude. - - To specify the rectangle, it requires a \l topLeft and \l bottomRight point, - both given by a \l {coordinate}. - - By default, the rectangle is displayed with transparent fill and a 1-pixel - thick black border. This can be changed using the \l color, \l border.color - and \l border.width properties. - - \note Similar to the \l MapPolygon type, MapRectangles are geographic - items, thus dragging a MapRectangle causes its vertices to be recalculated - in the geographic coordinate space. Apparent stretching of the item - occurs when dragged to the a different latitude, however, its edges - remain straight. - - \section2 Performance - - MapRectangles have a rendering cost identical to a MapPolygon with 4 - vertices. - - Like the other map objects, MapRectangle is normally drawn without a smooth - appearance. Setting the \l opacity property will force the object to be - blended, which decreases performance considerably depending on the hardware - in use. - - \section2 Example Usage - - The following snippet shows a map containing a MapRectangle, spanning - from (-27, 153) to (-28, 153.5), near Brisbane, Australia. The rectangle - is filled in green, with a 2 pixel black border. - - \code - Map { - MapRectangle { - color: 'green' - border.width: 2 - topLeft { - latitude: -27 - longitude: 153 - } - bottomRight { - latitude: -28 - longitude: 153.5 - } - } - } - \endcode - - \image api-maprectangle.png -*/ - -/*! - \qmlproperty bool QtLocation::MapRectangle::autoFadeIn - - This property holds whether the item automatically fades in when zooming into the map - starting from very low zoom levels. By default this is \c true. - Setting this property to \c false causes the map item to always have the opacity specified - with the \l QtQuick::Item::opacity property, which is 1.0 by default. - - \since 5.14 -*/ - -struct RectangleBackendSelector -{ - RectangleBackendSelector() - { - backend = (qgetenv("QTLOCATION_OPENGL_ITEMS").toInt()) ? QDeclarativeRectangleMapItem::OpenGL : QDeclarativeRectangleMapItem::Software; - } - QDeclarativeRectangleMapItem::Backend backend = QDeclarativeRectangleMapItem::Software; -}; - -Q_GLOBAL_STATIC(RectangleBackendSelector, mapRectangleBackendSelector) - -QDeclarativeRectangleMapItem::QDeclarativeRectangleMapItem(QQuickItem *parent) - : QDeclarativeGeoMapItemBase(parent), m_border(this), - m_d(new QDeclarativeRectangleMapItemPrivateCPU(*this)) -{ - // ToDo: handle envvar, and switch implementation. - m_itemType = QGeoMap::MapRectangle; - setFlag(ItemHasContents, true); - QObject::connect(&m_border, &QDeclarativeMapLineProperties::colorChanged, - this, &QDeclarativeRectangleMapItem::onLinePropertiesChanged); - QObject::connect(&m_border, &QDeclarativeMapLineProperties::widthChanged, - this, &QDeclarativeRectangleMapItem::onLinePropertiesChanged); - setBackend(mapRectangleBackendSelector->backend); -} - -QDeclarativeRectangleMapItem::~QDeclarativeRectangleMapItem() -{ -} - -/*! - \qmlproperty MapRectangle.Backend QtLocation::MapRectangle::backend - - This property holds which backend is in use to render the map item. - Valid values are \b MapRectangle.Software and \b{MapRectangle.OpenGL}. - The default value is \b{MapRectangle.Software}. - - \note \b{The release of this API with Qt 5.15 is a Technology Preview}. - Ideally, as the OpenGL backends for map items mature, there will be - no more need to also offer the legacy software-projection backend. - So this property will likely disappear at some later point. - To select OpenGL-accelerated item backends without using this property, - it is also possible to set the environment variable \b QTLOCATION_OPENGL_ITEMS - to \b{1}. - Also note that all current OpenGL backends won't work as expected when enabling - layers on the individual item, or when running on OpenGL core profiles greater than 2.x. - - \since 5.15 -*/ -QDeclarativeRectangleMapItem::Backend QDeclarativeRectangleMapItem::backend() const -{ - return m_backend; -} - -void QDeclarativeRectangleMapItem::setBackend(QDeclarativeRectangleMapItem::Backend b) -{ - if (b == m_backend) - return; - m_backend = b; - std::unique_ptr<QDeclarativeRectangleMapItemPrivate> d( - (m_backend == Software) ? static_cast<QDeclarativeRectangleMapItemPrivate *>( - new QDeclarativeRectangleMapItemPrivateCPU(*this)) - : static_cast<QDeclarativeRectangleMapItemPrivate *>( - new QDeclarativeRectangleMapItemPrivateOpenGL(*this))); - - std::swap(m_d, d); - m_d->onGeoGeometryChanged(); - emit backendChanged(); -} - -/*! - \internal -*/ -void QDeclarativeRectangleMapItem::setMap(QDeclarativeGeoMap *quickMap, QGeoMap *map) -{ - QDeclarativeGeoMapItemBase::setMap(quickMap,map); - if (!map) - return; - m_d->onMapSet(); -} - -/*! - \qmlpropertygroup Location::MapRectangle::border - \qmlproperty int MapRectangle::border.width - \qmlproperty color MapRectangle::border.color - - This property is part of the border property group. The border property group - holds the width and color used to draw the border of the rectangle. - The width is in pixels and is independent of the zoom level of the map. - - The default values correspond to a black border with a width of 1 pixel. - For no line, use a width of 0 or a transparent color. -*/ -QDeclarativeMapLineProperties *QDeclarativeRectangleMapItem::border() -{ - return &m_border; -} - -/*! - \qmlproperty coordinate MapRectangle::topLeft - - This property holds the top-left coordinate of the MapRectangle which - can be used to retrieve its longitude, latitude and altitude. -*/ -void QDeclarativeRectangleMapItem::setTopLeft(const QGeoCoordinate &topLeft) -{ - if (m_rectangle.topLeft() == topLeft) - return; - - m_rectangle.setTopLeft(topLeft); - m_d->onGeoGeometryChanged(); - emit topLeftChanged(topLeft); -} - -QGeoCoordinate QDeclarativeRectangleMapItem::topLeft() -{ - return m_rectangle.topLeft(); -} - -/*! - \internal -*/ -void QDeclarativeRectangleMapItem::markSourceDirtyAndUpdate() -{ - m_d->markSourceDirtyAndUpdate(); -} - -void QDeclarativeRectangleMapItem::onLinePropertiesChanged() -{ - m_d->onLinePropertiesChanged(); -} - -/*! - \qmlproperty coordinate MapRectangle::bottomRight - - This property holds the bottom-right coordinate of the MapRectangle which - can be used to retrieve its longitude, latitude and altitude. -*/ -void QDeclarativeRectangleMapItem::setBottomRight(const QGeoCoordinate &bottomRight) -{ - if (m_rectangle.bottomRight() == bottomRight) - return; - - m_rectangle.setBottomRight(bottomRight); - m_d->onGeoGeometryChanged(); - emit bottomRightChanged(bottomRight); -} - -QGeoCoordinate QDeclarativeRectangleMapItem::bottomRight() -{ - return m_rectangle.bottomRight(); -} - -/*! - \qmlproperty color MapRectangle::color - - This property holds the fill color of the rectangle. For no fill, use - a transparent color. -*/ -QColor QDeclarativeRectangleMapItem::color() const -{ - return m_color; -} - -void QDeclarativeRectangleMapItem::setColor(const QColor &color) -{ - if (m_color == color) - return; - m_color = color; - m_dirtyMaterial = true; - polishAndUpdate(); - emit colorChanged(m_color); -} - -/*! - \qmlproperty real MapRectangle::opacity - - This property holds the opacity of the item. Opacity is specified as a - number between 0 (fully transparent) and 1 (fully opaque). The default is 1. - - An item with 0 opacity will still receive mouse events. To stop mouse events, set the - visible property of the item to false. -*/ - -/*! - \internal -*/ -QSGNode *QDeclarativeRectangleMapItem::updateMapItemPaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) -{ - return m_d->updateMapItemPaintNode(oldNode, data); -} - -/*! - \internal -*/ -void QDeclarativeRectangleMapItem::updatePolish() -{ - if (!map() || map()->geoProjection().projectionType() != QGeoProjection::ProjectionWebMercator) - return; - m_d->updatePolish(); -} - -/*! - \internal -*/ -void QDeclarativeRectangleMapItem::afterViewportChanged(const QGeoMapViewportChangeEvent &event) -{ - if (event.mapSize.width() <= 0 || event.mapSize.height() <= 0) - return; - m_d->afterViewportChanged(); -} - -/*! - \internal -*/ -bool QDeclarativeRectangleMapItem::contains(const QPointF &point) const -{ - return m_d->contains(point); -} - -const QGeoShape &QDeclarativeRectangleMapItem::geoShape() const -{ - return m_rectangle; -} - -void QDeclarativeRectangleMapItem::setGeoShape(const QGeoShape &shape) -{ - if (shape == m_rectangle) - return; - - const QGeoRectangle rectangle = m_rectangle.boundingGeoRectangle(); - const bool tlHasChanged = rectangle.topLeft() != m_rectangle.topLeft(); - const bool brHasChanged = rectangle.bottomRight() != m_rectangle.bottomRight(); - m_rectangle = rectangle; - - m_d->onGeoGeometryChanged(); - if (tlHasChanged) - emit topLeftChanged(m_rectangle.topLeft()); - if (brHasChanged) - emit bottomRightChanged(m_rectangle.bottomRight()); -} - -/*! - \internal -*/ -void QDeclarativeRectangleMapItem::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) -{ - if (!map() || !m_rectangle.isValid() || m_updatingGeometry || newGeometry.topLeft() == oldGeometry.topLeft()) { - QDeclarativeGeoMapItemBase::geometryChange(newGeometry, oldGeometry); - return; - } - // TODO: change the algorithm to preserve the distances and size - QGeoCoordinate newCenter = map()->geoProjection().itemPositionToCoordinate(QDoubleVector2D(newGeometry.center()), false); - QGeoCoordinate oldCenter = map()->geoProjection().itemPositionToCoordinate(QDoubleVector2D(oldGeometry.center()), false); - if (!newCenter.isValid() || !oldCenter.isValid()) - return; - double offsetLongi = newCenter.longitude() - oldCenter.longitude(); - double offsetLati = newCenter.latitude() - oldCenter.latitude(); - if (offsetLati == 0.0 && offsetLongi == 0.0) - return; - - m_rectangle.translate(offsetLati, offsetLongi); - m_d->onItemGeometryChanged(); - emit topLeftChanged(m_rectangle.topLeft()); - emit bottomRightChanged(m_rectangle.bottomRight()); - - // Not calling QDeclarativeGeoMapItemBase::geometryChange() as it will be called from a nested - // call to this function. -} - -QDeclarativeRectangleMapItemPrivate::~QDeclarativeRectangleMapItemPrivate() {} - -QDeclarativeRectangleMapItemPrivateCPU::~QDeclarativeRectangleMapItemPrivateCPU() {} - -QDeclarativeRectangleMapItemPrivateOpenGL::~QDeclarativeRectangleMapItemPrivateOpenGL() {} - -QT_END_NAMESPACE |