[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