Updates to accuracy ring radius and item's bounding rect.
authorSami Rämö <sami.ramo@ixonos.com>
Fri, 30 Jul 2010 13:09:19 +0000 (16:09 +0300)
committerSami Rämö <sami.ramo@ixonos.com>
Fri, 30 Jul 2010 13:09:19 +0000 (16:09 +0300)
 - Accuracy ring radius is calculated from the accuracy got from
   the GPS.

 - Item's bounding rect is updated when accuracy ring radius
   changes, so there should not be any drawing artifacts anymore.

 - Removed SceneCoordinate dependency from GPSLocationItem.

src/map/gpslocationitem.cpp
src/map/gpslocationitem.h
src/map/mapengine.cpp

index e822bad..ccb422f 100644 (file)
 */
 
 #include <QDebug>
-#include <QGraphicsPixmapItem>
 #include <QPainter>
 
-#include "coordinates/scenecoordinate.h"
 #include "gps/gpscommon.h"
 #include "map/mapcommon.h"
 
@@ -32,8 +30,7 @@
 const qreal RING_OUTLINE_PEN_WIDTH = 1.0;
 
 GPSLocationItem::GPSLocationItem()
-    : m_showOnNextUpdate(true),
-      m_radius(3000)
+    : m_showOnNextUpdate(true)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
@@ -47,21 +44,15 @@ GPSLocationItem::GPSLocationItem()
 
 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);
 
@@ -94,15 +85,36 @@ void GPSLocationItem::setEnabled(bool enable)
         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();
index c9ef6a4..9d91c14 100644 (file)
@@ -24,8 +24,6 @@
 
 #include <QGraphicsItem>
 
-class SceneCoordinate;
-
 /**
   * @brief Class for indicating current position accuired from GPS on the map.
   *
@@ -74,11 +72,14 @@ public:
       *
       * @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
@@ -90,6 +91,8 @@ private:
     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
index 7425f56..5eb4bca 100644 (file)
@@ -233,9 +233,15 @@ void MapEngine::gpsPositionUpdate(GeoCoordinate position, qreal accuracy)
 {
     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;