[Marble-commits] KDE/kdeedu/marble/src/lib

Thibaut Gridel tgridel at free.fr
Thu Aug 26 20:18:45 CEST 2010


SVN commit 1168464 by tgridel:

PositionTracking: use private class and provide slots to manipulate the track

 M  +92 -61    PositionTracking.cpp  
 M  +21 -14    PositionTracking.h  
 A             PositionTracking_p.h   [License: LGPL]


--- trunk/KDE/kdeedu/marble/src/lib/PositionTracking.cpp #1168463:1168464
@@ -22,27 +22,73 @@
 #include "MarbleDebug.h"
 #include "PositionProviderPlugin.h"
 
+#include "PositionTracking_p.h"
+
 using namespace Marble;
 
+void PositionTrackingPrivate::setPosition( GeoDataCoordinates position,
+                                           GeoDataAccuracy accuracy )
+{
+    Q_UNUSED( accuracy );
+    if ( m_positionProvider && m_positionProvider->status() ==
+        PositionProviderStatusAvailable )
+    {
+        GeoDataPlacemark *placemark = static_cast<GeoDataPlacemark*>(m_document->child(m_document->size()-1));
+        GeoDataMultiGeometry *geometry = static_cast<GeoDataMultiGeometry*>(placemark->geometry());
+        m_currentLineString->append(position);
+
+        //if the position has moved then update the current position
+        if ( !( m_gpsCurrentPosition ==
+                position ) )
+        {
+            placemark = static_cast<GeoDataPlacemark*>(m_document->child(0));
+            placemark->setCoordinate(position);
+            m_gpsCurrentPosition = position;
+            qreal speed = m_positionProvider->speed();
+            emit gpsLocation( position, speed );
+        }
+    }
+}
+
+
+void PositionTrackingPrivate::setStatus( PositionProviderStatus status )
+{
+    if (status == PositionProviderStatusAvailable) {
+        Q_ASSERT(m_document);
+        GeoDataPlacemark *placemark = static_cast<GeoDataPlacemark*>(m_document->child(m_document->size()-1));
+        GeoDataMultiGeometry *multiGeometry = static_cast<GeoDataMultiGeometry*>(placemark->geometry());
+        m_currentLineString = new GeoDataLineString;
+        multiGeometry->append(m_currentLineString);
+    }
+
+    emit statusChanged( status );
+}
+
 PositionTracking::PositionTracking( FileManager *fileManager,
                           QObject *parent )
-     : QObject( parent ), m_fileManager(fileManager), m_positionProvider(0)
+     : QObject( parent ), d (new PositionTrackingPrivate(fileManager, parent))
 {
-    m_document     = new GeoDataDocument();
-    m_document->setName("Position Tracking");
 
+    connect( d, SIGNAL( gpsLocation(GeoDataCoordinates,qreal) ),
+             this, SIGNAL( gpsLocation(GeoDataCoordinates,qreal) ));
+    connect( d, SIGNAL( statusChanged(PositionProviderStatus)),
+             this, SIGNAL( statusChanged(PositionProviderStatus) ) );
+
+    d->m_document     = new GeoDataDocument();
+    d->m_document->setName("Position Tracking");
+
     // First point is current position
     GeoDataPlacemark *placemark = new GeoDataPlacemark;
     placemark->setName("Current Position");
     placemark->setVisible(false);
-    m_document->append(placemark);
+    d->m_document->append(placemark);
 
     // Second point is position track
     placemark = new GeoDataPlacemark;
     GeoDataMultiGeometry *multiGeometry = new GeoDataMultiGeometry;
-    GeoDataLineString *lineString = new GeoDataLineString;
+    d->m_currentLineString = new GeoDataLineString;
 
-    multiGeometry->append(lineString);
+    multiGeometry->append(d->m_currentLineString);
     placemark->setGeometry(multiGeometry);
     placemark->setName("Current Track");
 
@@ -56,94 +102,79 @@
     GeoDataStyleMap styleMap;
     styleMap.setStyleId("map-track");
     styleMap.insert("normal", QString("#").append(style.styleId()));
-    m_document->addStyleMap(styleMap);
-    m_document->addStyle(style);
+    d->m_document->addStyleMap(styleMap);
+    d->m_document->addStyle(style);
 
     placemark->setStyleUrl(QString("#").append(styleMap.styleId()));
-    m_document->append(placemark);
+    d->m_document->append(placemark);
 
-    m_fileManager->addGeoDataDocument(m_document);
+    d->m_fileManager->addGeoDataDocument(d->m_document);
 }
 
 
 PositionTracking::~PositionTracking()
 {
+    delete d;
 }
 
-void PositionTracking::setPosition( GeoDataCoordinates position,
-                                    GeoDataAccuracy accuracy )
-{
-    Q_UNUSED( accuracy );
-    if ( m_positionProvider && m_positionProvider->status() ==
-        PositionProviderStatusAvailable )
-    {
-        GeoDataPlacemark *placemark = static_cast<GeoDataPlacemark*>(m_document->child(m_document->size()-1));
-        GeoDataMultiGeometry *geometry = static_cast<GeoDataMultiGeometry*>(placemark->geometry());
-        GeoDataLineString *lineString = static_cast<GeoDataLineString*>(geometry->child(geometry->size()-1));
-        lineString->append(position);
-
-        //if the position has moved then update the current position
-        if ( !( m_gpsCurrentPosition ==
-                position ) )
-        {
-            placemark = static_cast<GeoDataPlacemark*>(m_document->child(0));
-            placemark->setCoordinate(position);
-            m_gpsCurrentPosition = position;
-            emit gpsLocation( position, speed() );
-        }
-    }
-}
-
-
-void PositionTracking::setStatus( PositionProviderStatus status )
-{
-    if (status == PositionProviderStatusAvailable) {
-        GeoDataPlacemark *placemark = static_cast<GeoDataPlacemark*>( m_document->child(m_document->size()-1 ) );
-        GeoDataMultiGeometry *multiGeometry = static_cast<GeoDataMultiGeometry*>( placemark->geometry() );
-        GeoDataLineString *lineString = new GeoDataLineString;
-        multiGeometry->append( lineString );
-    }
-
-    emit statusChanged( status );
-}
-
 void PositionTracking::setPositionProviderPlugin( PositionProviderPlugin* plugin )
 {
-    if ( m_positionProvider ) {
-        m_positionProvider->deleteLater();
+    if ( d->m_positionProvider ) {
+        d->m_positionProvider->deleteLater();
     }
 
-    m_positionProvider = plugin;
+    d->m_positionProvider = plugin;
 
-    if ( m_positionProvider ) {
-        m_positionProvider->setParent( this );
-        mDebug() << "Initializing position provider:" << m_positionProvider->name();
-        connect( m_positionProvider, SIGNAL( statusChanged( PositionProviderStatus ) ),
-                this, SLOT( setStatus(PositionProviderStatus) ) );
-        connect( m_positionProvider, SIGNAL( positionChanged( GeoDataCoordinates,GeoDataAccuracy ) ),
-                 this, SLOT( setPosition( GeoDataCoordinates,GeoDataAccuracy ) ) );
+    if ( d->m_positionProvider ) {
+        d->m_positionProvider->setParent( this );
+        mDebug() << "Initializing position provider:" << d->m_positionProvider->name();
+        connect( d->m_positionProvider, SIGNAL( statusChanged( PositionProviderStatus ) ),
+                d, SLOT( setStatus(PositionProviderStatus) ) );
+        connect( d->m_positionProvider, SIGNAL( positionChanged( GeoDataCoordinates,GeoDataAccuracy ) ),
+                 d, SLOT( setPosition( GeoDataCoordinates,GeoDataAccuracy ) ) );
 
-        m_positionProvider->initialize();
+        d->m_positionProvider->initialize();
     }
     emit positionProviderPluginChanged( plugin );
 }
 
 QString PositionTracking::error() const
 {
-    return m_positionProvider ? m_positionProvider->error() : QString();
+    return d->m_positionProvider ? d->m_positionProvider->error() : QString();
 }
 
 
 //get speed from provider
 qreal PositionTracking::speed() const
 {
-    return m_positionProvider ? m_positionProvider->speed() : 0 ;
+    return d->m_positionProvider ? d->m_positionProvider->speed() : 0 ;
 }
 
 //get direction from provider
 qreal PositionTracking::direction() const
 {
-    return m_positionProvider ? m_positionProvider->direction() : 0 ;
+    return d->m_positionProvider ? d->m_positionProvider->direction() : 0 ;
 }
 
+bool PositionTracking::trackVisible() const
+{
+    return d->m_document->isVisible();
+}
+
+void PositionTracking::setTrackVisible( bool visible )
+{
+    d->m_document->setVisible( visible );
+}
+
+void PositionTracking::clearTrack()
+{
+    GeoDataPlacemark *placemark = static_cast<GeoDataPlacemark*>(d->m_document->child(d->m_document->size()-1));
+    GeoDataMultiGeometry *multiGeometry = static_cast<GeoDataMultiGeometry*>(placemark->geometry());
+    d->m_currentLineString = new GeoDataLineString;
+    multiGeometry->clear();
+    multiGeometry->append(d->m_currentLineString);
+
+}
+
 #include "PositionTracking.moc"
+#include "PositionTracking_p.moc"
--- trunk/KDE/kdeedu/marble/src/lib/PositionTracking.h #1168463:1168464
@@ -26,6 +26,7 @@
 class GeoDataDocument;
 class GeoDataCoordinates;
 class PositionProviderPlugin;
+class PositionTrackingPrivate;
 
 class MARBLE_EXPORT PositionTracking : public QObject
 {
@@ -43,6 +44,9 @@
       */
     void setPositionProviderPlugin( PositionProviderPlugin* plugin );
 
+    /**
+      * @brief gives the error message from the current position provider
+      */
     QString error() const;
 
     /**
@@ -55,6 +59,22 @@
      */
     qreal direction() const;
 
+    /**
+     * @brief provides the visibility of the Position Tracking document
+     */
+    bool trackVisible() const;
+
+public Q_SLOTS:
+    /**
+      * Toggles the visibility of the Position Tracking document
+      */
+    void setTrackVisible ( bool visible );
+
+    /**
+      * Removes all track segments which were recorded
+      */
+    void clearTrack();
+
 Q_SIGNALS:
     void  gpsLocation( GeoDataCoordinates, qreal );
 
@@ -66,21 +86,8 @@
 
     void positionProviderPluginChanged( PositionProviderPlugin *activePlugin );
 
-public slots:
-    void setPosition( GeoDataCoordinates position,
-                          GeoDataAccuracy accuracy );
-
-    void setStatus( PositionProviderStatus status );
-
  private:
-
-    GeoDataDocument     *m_document;
-    FileManager         *m_fileManager;
-
-    GeoDataCoordinates  m_gpsCurrentPosition;
-    GeoDataCoordinates  m_gpsPreviousPosition;
-
-    PositionProviderPlugin* m_positionProvider;
+    PositionTrackingPrivate *d;
 };
 
 }


More information about the Marble-commits mailing list