[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/KDE/4.5/kdeedu/marble/src
From:       Dennis Nienhüser <earthwings () gentoo ! org>
Date:       2010-09-11 14:19:38
Message-ID: 20100911141938.756E5AC888 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1174219 by nienhueser:

- The position marker is a bit hard to spot on the N900 when there's only time for a \
quick glance at the screen. To improve that paint a half-transparent red circle at \
the current position (all versions). To give it a right to exist other than enhanced \
visibility, its size depends on the accuracy of the current position. The circle can \
be interpreted "the device is pretty sure that the real position is within the \
                colored circle".
RB: 5168
Use a less transparent color and a minimum circle size for small screen devices to \
                enhance the visibility of the position marker there. Backport of \
                commit 1170361.
- Non-inline ctor. Backport of commit 1174217.
- Hopefully fix the build of the GpsdPositionProviderPlugin (builds at least on SUSE \
11.2 right now). Backport of commit 1173799.


 A             lib/geodata/data/GeoDataAccuracy.cpp   [License: LGPL]
 M  +5 -5      lib/geodata/data/GeoDataAccuracy.h  
 M  +54 -0     lib/gps/PositionTracking.cpp  
 M  +4 -0      lib/gps/PositionTracking.h  
 M  +12 -3     plugins/positionprovider/gpsd/GpsdPositionProviderPlugin.cpp  
 M  +2 -4      plugins/positionprovider/maemo/MaemoPositionProviderPlugin.cpp  


--- branches/KDE/4.5/kdeedu/marble/src/lib/geodata/data/GeoDataAccuracy.h \
#1174218:1174219 @@ -12,14 +12,14 @@
 #ifndef MARBLE_GEODATAACCURACY_H
 #define MARBLE_GEODATAACCURACY_H
 
+#include <marble_export.h>
+
 #include <QtCore/QObject>
 
-
-
 namespace Marble
 {
 
-class GeoDataAccuracy
+class MARBLE_EXPORT GeoDataAccuracy
 {
  public:
     /**
@@ -44,10 +44,10 @@
      * @brief Vertical accuracy in meters.
      */
     qreal vertical;
+
+    GeoDataAccuracy();
 };
 
 }
 
-
-
 #endif
--- branches/KDE/4.5/kdeedu/marble/src/lib/gps/PositionTracking.cpp #1174218:1174219
@@ -20,6 +20,8 @@
 #include "MarbleMath.h"
 #include "MarbleDebug.h"
 #include "ViewParams.h"
+#include "ViewportParams.h"
+#include "AbstractProjection.h"
 
 #include <QtXml/QXmlInputSource>
 #include <QtXml/QXmlSimpleReader>
@@ -105,6 +107,7 @@
             dirty |= rect ;
         }
 
+        dirty |= accuracyIndicatorRegion( viewParams ).toRect();
         return dirty;
 }
 
@@ -181,12 +184,38 @@
     construct( canvasSize, viewParams );
 
     painter->save();
+    
+    QRectF accuracyIndicator;
+    if ( m_gpsCurrentPosition && accuracy().horizontal > 0 && accuracy().horizontal \
< 1000 ) { +        // Paint a red circle indicating the position accuracy
+        QColor transparentRed = QColor::fromRgb( 226, 8, 0 );
+        if ( MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen ) {
+            transparentRed.setAlpha( 80 );
+        } else {
+            transparentRed.setAlpha( 40 );
+        }
+
+        painter->setPen( transparentRed );
+        painter->setBrush( transparentRed );
+        accuracyIndicator = accuracyIndicatorRegion( viewParams );
+        painter->drawEllipse( accuracyIndicator );
+    }
+    
+    
     painter->setPen( Qt::black );
     painter->setBrush( Qt::white );
     painter->drawPolygon( m_currentDraw );
     painter->restore();
     m_previousDraw = m_currentDraw;
+    
+    // Make a combined polygon of the previous position and the accuracy indicator \
circle +    // This is ok as they are painted at the same position. It avoids adding \
another class +    // member (which had to be static for ABI compatibility)
+    if ( !accuracyIndicator.isNull() ) {
+        m_previousDraw << accuracyIndicator.topLeft() << \
accuracyIndicator.topRight(); +        m_previousDraw << \
accuracyIndicator.bottomLeft() << accuracyIndicator.bottomRight();  }
+}
 
 void PositionTracking::setPositionProviderPlugin( PositionProviderPlugin* plugin )
 {
@@ -210,4 +239,29 @@
     return m_positionProvider ? m_positionProvider->error() : QString();
 }
 
+GeoDataAccuracy PositionTracking::accuracy() const
+{
+    return m_positionProvider ? m_positionProvider->accuracy() : GeoDataAccuracy();
+}
+
+QRectF PositionTracking::accuracyIndicatorRegion( ViewParams *viewParams ) const
+{
+    QRectF result;
+    if ( m_gpsCurrentPosition ) {
+        qreal width = qRound( accuracy().horizontal * \
viewParams->viewport()->radius() / EARTH_RADIUS ); +        if ( \
MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen ) { +            \
qreal arrowSize = qMax<qreal>( m_currentDraw.boundingRect().width(), \
m_currentDraw.boundingRect().height() ); +            width = qMax<qreal>( width, \
arrowSize + 10 ); +        }
+        
+        qreal x(0), y(0);
+        AbstractProjection * projection = \
viewParams->viewport()->currentProjection(); +        if ( \
projection->screenCoordinates( m_gpsCurrentPosition->position(), \
viewParams->viewport(), x, y ) ) { +            result = QRectF( x - width / 2.0, y - \
width / 2.0, width, width ); +        }
+    }
+    
+    return result;
+}  
+
 #include "PositionTracking.moc"
--- branches/KDE/4.5/kdeedu/marble/src/lib/gps/PositionTracking.h #1174218:1174219
@@ -90,6 +90,8 @@
 
     QString error() const;
 
+    GeoDataAccuracy accuracy() const;
+
  public slots:
     void  notifyPosition( GeoDataCoordinates );
 
@@ -101,6 +103,8 @@
  private:
     void updateSpeed( TrackPoint* previous, TrackPoint* next );
 
+    QRectF accuracyIndicatorRegion( ViewParams *viewParams ) const;
+
     qreal               m_speed;
     //used to draw the arrow in gps tracking
     QPointF             m_relativeTip;
--- branches/KDE/4.5/kdeedu/marble/src/plugins/positionprovider/gpsd/GpsdPositionProviderPlugin.cpp \
#1174218:1174219 @@ -64,10 +64,19 @@
         m_position.set( data.fix.longitude, data.fix.latitude,
                         data.fix.altitude, GeoDataCoordinates::Degree );
         m_accuracy.level = GeoDataAccuracy::Detailed;
-        // FIXME: Add real values here
-        m_accuracy.horizontal = 5;
-        m_accuracy.vertical = 5;
+#if defined( GPSD_API_MAJOR_VERSION ) && ( GPSD_API_MAJOR_VERSION >= 3 )
+         if ( !isnan( data.fix.epx ) && !isnan( data.fix.epy ) ) {
+             m_accuracy.horizontal = qMax( data.fix.epx, data.fix.epy );
     }
+#else
+        if ( !isnan( data.fix.eph ) ) {
+            m_accuracy.horizontal = data.fix.eph;
+        }
+#endif
+        if ( !isnan( data.fix.epv ) ) {
+            m_accuracy.vertical = data.fix.epv;
+        }
+    }
     if (m_status != oldStatus)
         emit statusChanged( m_status );
     // FIXME: Check whether position has changed first
--- branches/KDE/4.5/kdeedu/marble/src/plugins/positionprovider/maemo/MaemoPositionProviderPlugin.cpp \
#1174218:1174219 @@ -98,12 +98,10 @@
 {
     GeoDataAccuracy result;
 
-    // FIXME: I'm not sure what is expected here, the documentation in
-    // Marble is a bit coarse and I did not find any class using it
     if ( status() == PositionProviderStatusAvailable ) {
         result.level = GeoDataAccuracy::Detailed;
-        result.horizontal = d->m_device->fix->eph; // horizontal position accuracy \
                in centimeter
-        result.vertical = d->m_device->fix->epv; // vertical position accuracy in \
meter +        result.horizontal = d->m_device->fix->eph / 100.0; // cm => meter
+        result.vertical = d->m_device->fix->epv; // meter
     }
     else {
         result.level = GeoDataAccuracy::none;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic