*/
#include <QDebug>
-#include <QGraphicsPixmapItem>
#include <QPainter>
-#include "coordinates/scenecoordinate.h"
#include "gps/gpscommon.h"
#include "map/mapcommon.h"
const qreal RING_OUTLINE_PEN_WIDTH = 1.0;
GPSLocationItem::GPSLocationItem()
- : m_showOnNextUpdate(true),
- m_radius(3000)
+ : m_showOnNextUpdate(true)
{
qDebug() << __PRETTY_FUNCTION__;
QRectF GPSLocationItem::boundingRect() const
{
- return QRectF(-m_radius - RING_OUTLINE_PEN_WIDTH / 2, -m_radius - RING_OUTLINE_PEN_WIDTH / 2,
- 2 * m_radius + RING_OUTLINE_PEN_WIDTH, 2 * m_radius + RING_OUTLINE_PEN_WIDTH);
-}
-
-void GPSLocationItem::calculateAccuracyRingRadius()
-{
- /// @todo calculate radius based on the current zoom level
- m_radius;
+ return m_boundingRect;
}
void GPSLocationItem::paint(QPainter *painter,
const QStyleOptionGraphicsItem *option,
QWidget *widget)
{
-// QGraphicsPixmapItem::paint(painter, option, widget);
+ Q_UNUSED(option);
+ Q_UNUSED(widget);
QColor color = QColor(Qt::red);
m_showOnNextUpdate = false;
hide();
}
+}
+
+void GPSLocationItem::setAccuracyRingRadius(qreal accuracy, qreal sceneResolution)
+{
+ qreal newRadius = accuracy / sceneResolution;
+
+ if (m_radius != newRadius) {
+ m_radius = newRadius;
+ setBoundingRect(newRadius);
+ }
+}
+
+void GPSLocationItem::setBoundingRect(qreal radius)
+{
+ prepareGeometryChange();
+ m_boundingRect = QRectF(-radius - RING_OUTLINE_PEN_WIDTH / 2,
+ -radius - RING_OUTLINE_PEN_WIDTH / 2,
+ 2 * radius + RING_OUTLINE_PEN_WIDTH,
+ 2 * radius + RING_OUTLINE_PEN_WIDTH);
}
-void GPSLocationItem::updatePosition(SceneCoordinate coordinate, qreal accuracy)
+void GPSLocationItem::updateItem(QPointF scenePosition, qreal accuracy, qreal sceneResolution)
{
- qWarning() << __PRETTY_FUNCTION__ << "accuracy:" << accuracy;
+ qWarning() << __PRETTY_FUNCTION__
+ << "accuracy:" << accuracy
+ << "sceneResolution:" << sceneResolution;
- setPos(coordinate.toPointF());
- m_accuracy = accuracy;
+ setPos(scenePosition);
+ setAccuracyRingRadius(accuracy, sceneResolution);
if (m_showOnNextUpdate) {
show();
#include <QGraphicsItem>
-class SceneCoordinate;
-
/**
* @brief Class for indicating current position accuired from GPS on the map.
*
*
* @param coordinate Scene coordinate
* @param accuracy Accuracy of the GPS fix
+ * @param sceneResolution Scene horizontal resolution at given coordinate latitude level
*/
- void updatePosition(SceneCoordinate coordinate, qreal accuracy);
+ void updateItem(QPointF scenePosition, qreal accuracy, qreal sceneResolution);
private:
- void calculateAccuracyRingRadius();
+ void setAccuracyRingRadius(qreal accuracy, qreal sceneResolution);
+
+ void setBoundingRect(qreal radius);
/*******************************************************************************
* DATA MEMBERS
qreal m_radius; ///< accuracy ring radius in scene pixels
QPixmap m_pixmap; ///< red led pixmap
+
+ QRectF m_boundingRect; ///< item's bounding rect
};
#endif // GPSLOCATIONITEM_H
{
qDebug() << __PRETTY_FUNCTION__;
- m_gpsLocationItem->updatePosition(SceneCoordinate(position), accuracy);
+ // update GPS location item (but only if accuracy is a valid number)
+ if (!isnan(accuracy)) {
+ qreal resolution = MapScene::horizontalResolutionAtLatitude(position.latitude());
+ m_gpsLocationItem->updateItem(SceneCoordinate(position).toPointF(), accuracy, resolution);
+ }
+
m_mapScene->spanItems(m_zoomLevel, m_sceneCoordinate, m_viewSize);
+ // do automatic centering (if enabled)
if (m_autoCenteringEnabled) {
m_lastAutomaticPosition = SceneCoordinate(position);
m_scrollStartedByGps = true;