8 #include "MarbleQuickItem.h"
10 #include "PositionTracking.h"
11 #include "RenderPlugin.h"
13 #include "AutoNavigation.h"
19 m_positionSource( nullptr ),
20 m_positionMarker( nullptr ),
21 m_marbleQuickItem( nullptr ),
22 m_hasLastKnownPosition( false ),
23 m_autoNavigation( nullptr ),
24 m_positionMarkerType(
None )
26 connect( &m_lastKnownPosition, SIGNAL(longitudeChanged()),
this, SLOT(setHasLastKnownPosition()) );
27 connect( &m_lastKnownPosition, SIGNAL(latitudeChanged()),
this, SLOT(setHasLastKnownPosition()) );
30 bool Tracking::showTrack()
const
35 void Tracking::setShowTrack(
bool show )
37 if ( show != m_showTrack ) {
38 if ( m_marbleQuickItem ) {
39 m_marbleQuickItem->model()->positionTracking()->setTrackVisible( show );
40 m_marbleQuickItem->update();
44 emit showTrackChanged();
48 PositionSource* Tracking::positionSource()
50 return m_positionSource;
53 void Tracking::setPositionSource( PositionSource* source )
55 if ( source != m_positionSource ) {
56 m_positionSource = source;
58 connect( source, SIGNAL(positionChanged()),
59 this, SLOT(updatePositionMarker()) );
60 connect( source, SIGNAL(positionChanged()),
61 this, SLOT(updateLastKnownPosition()) );
62 connect( source, SIGNAL(hasPositionChanged()),
63 this, SLOT(updatePositionMarker()) );
64 connect( source, SIGNAL(positionChanged()),
65 this, SIGNAL(distanceChanged()) );
67 emit positionSourceChanged();
71 MarbleQuickItem* Tracking::map()
73 return m_marbleQuickItem;
76 void Tracking::setMap( MarbleQuickItem* item )
78 if ( item != m_marbleQuickItem ) {
79 m_marbleQuickItem = item;
81 if ( m_marbleQuickItem ) {
82 m_marbleQuickItem->model()->positionTracking()->setTrackVisible( showTrack() );
83 setShowPositionMarkerPlugin( m_positionMarkerType == Arrow );
85 connect( m_marbleQuickItem, SIGNAL(visibleLatLonAltBoxChanged()),
this, SLOT(updatePositionMarker()) );
86 connect( m_marbleQuickItem, SIGNAL(mapThemeChanged()),
this, SLOT(updatePositionMarker()) );
93 void Tracking::setPositionMarker(
QObject* marker )
95 if ( marker != m_positionMarker ) {
96 m_positionMarker = marker;
97 emit positionMarkerChanged();
101 QObject* Tracking::positionMarker()
103 return m_positionMarker;
106 void Tracking::updatePositionMarker()
108 if ( m_marbleQuickItem && m_positionMarker && m_positionMarkerType == Circle ) {
110 bool visible = (m_marbleQuickItem->model()->planetId() ==
QLatin1String(
"earth"));
111 if ( m_positionSource && m_positionSource->hasPosition() ) {
112 position = m_positionSource->position();
113 }
else if ( hasLastKnownPosition() ) {
114 position = lastKnownPosition();
122 visible = visible && m_marbleQuickItem->map()->viewport()->screenCoordinates( pos.longitude(), pos.latitude(), x, y );
123 QQuickItem* item = qobject_cast<QQuickItem*>( m_positionMarker );
132 }
else if ( m_positionMarkerType != Circle ) {
133 QQuickItem* item = qobject_cast<QQuickItem*>( m_positionMarker );
140 void Tracking::updateLastKnownPosition()
142 if ( m_positionSource && m_positionSource->hasPosition() ) {
143 setLastKnownPosition( m_positionSource->position() );
147 void Tracking::setHasLastKnownPosition()
149 if ( !m_hasLastKnownPosition ) {
150 m_hasLastKnownPosition =
true;
151 emit hasLastKnownPositionChanged();
155 void Tracking::setShowPositionMarkerPlugin(
bool visible )
157 if ( m_marbleQuickItem ) {
159 for( RenderPlugin* renderPlugin: renderPlugins ) {
160 Q_ASSERT( renderPlugin );
161 if (renderPlugin->nameId() ==
QLatin1String(
"positionMarker")) {
162 renderPlugin->setEnabled(
true );
163 renderPlugin->setVisible( visible );
169 bool Tracking::hasLastKnownPosition()
const
171 return m_hasLastKnownPosition;
176 return &m_lastKnownPosition;
179 void Tracking::setLastKnownPosition(
Coordinate* lastKnownPosition )
181 if ( lastKnownPosition && *lastKnownPosition != m_lastKnownPosition ) {
183 emit lastKnownPositionChanged();
187 bool Tracking::autoCenter()
const
189 if ( m_autoNavigation ) {
190 return m_autoNavigation->recenterMode() != Marble::AutoNavigation::DontRecenter;
196 void Tracking::setAutoCenter(
bool enabled )
198 if ( autoCenter() != enabled ) {
199 if ( enabled && !m_autoNavigation && m_marbleQuickItem ) {
200 m_autoNavigation =
new Marble::AutoNavigation( m_marbleQuickItem->model(), m_marbleQuickItem->map()->viewport(),
this );
202 m_marbleQuickItem, SLOT(
zoomIn()) );
204 m_marbleQuickItem, SLOT(
zoomOut()) );
205 connect( m_autoNavigation, SIGNAL(centerOn(GeoDataCoordinates,
bool)),
206 m_marbleQuickItem, SLOT(centerOn(GeoDataCoordinates)) );
208 connect( m_marbleQuickItem, SIGNAL(visibleLatLonAltBoxChanged()),
209 m_autoNavigation, SLOT(inhibitAutoAdjustments()) );
212 if ( m_autoNavigation ) {
213 m_autoNavigation->setRecenter( Marble::AutoNavigation::RecenterOnBorder );
216 emit autoCenterChanged();
220 bool Tracking::autoZoom()
const
222 if ( m_autoNavigation ) {
223 return m_autoNavigation->autoZoom();
229 void Tracking::setAutoZoom(
bool enabled )
231 if ( autoZoom() != enabled ) {
232 if ( enabled && !m_autoNavigation && m_marbleQuickItem ) {
233 m_autoNavigation =
new Marble::AutoNavigation( m_marbleQuickItem->model(), m_marbleQuickItem->map()->viewport(),
this );
235 m_marbleQuickItem, SLOT(
zoomIn()) );
237 m_marbleQuickItem, SLOT(
zoomOut()) );
238 connect( m_autoNavigation, SIGNAL(centerOn(GeoDataCoordinates,
bool)),
239 m_marbleQuickItem, SLOT(centerOn(GeoDataCoordinates)) );
241 connect( m_marbleQuickItem, SIGNAL(visibleLatLonAltBoxChanged()),
242 m_autoNavigation, SLOT(inhibitAutoAdjustments()) );
245 if ( m_autoNavigation ) {
246 m_autoNavigation->setAutoZoom( enabled );
249 emit autoZoomChanged();
253 Tracking::PositionMarkerType Tracking::positionMarkerType()
const
255 return m_positionMarkerType;
258 void Tracking::setPositionMarkerType( Tracking::PositionMarkerType type )
260 setShowPositionMarkerPlugin( type == Arrow );
261 if ( type != m_positionMarkerType ) {
262 m_positionMarkerType =
type;
263 emit positionMarkerTypeChanged();
267 double Tracking::distance()
const
269 return m_marbleQuickItem ? m_marbleQuickItem->model()->positionTracking()->length( m_marbleQuickItem->model()->planetRadius() ) : 0.0;
272 void Tracking::saveTrack(
const QString &fileName )
274 if ( m_marbleQuickItem ) {
277 m_marbleQuickItem->model()->positionTracking()->saveTrack( target );
281 void Tracking::openTrack(
const QString &fileName)
283 if ( m_marbleQuickItem ) {
286 m_marbleQuickItem->model()->addGeoDataFile( target );
290 void Tracking::clearTrack()
292 if ( m_marbleQuickItem ) {
293 m_marbleQuickItem->model()->positionTracking()->clearTrack();
299 #include "moc_Tracking.cpp"