Qt Virtual Chart Table (QVCT)
CRouteOverlay.cpp
Go to the documentation of this file.
1 // INDENTING (emacs/vi): -*- mode:c++; tab-width:2; c-basic-offset:2; intent-tabs-mode:nil; -*- ex: set tabstop=2 expandtab:
2 
3 /*
4  * Qt Virtual Chart Table (QVCT)
5  * Copyright (C) 2012 Cedric Dufour <http://cedric.dufour.name>
6  * Author: Cedric Dufour <http://cedric.dufour.name>
7  *
8  * The Qt Virtual Chart Table (QVCT) is free software:
9  * you can redistribute it and/or modify it under the terms of the GNU General
10  * Public License as published by the Free Software Foundation, Version 3.
11  *
12  * The Qt Virtual Chart Table (QVCT) is distributed in the hope
13  * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
14  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15  *
16  * See the GNU General Public License for more details.
17  */
18 
19 // QT
20 #include <QByteArray>
21 #include <QDataStream>
22 #include <QDomDocument> // QtXml module
23 #include <QFileInfo>
24 #include <QList>
25 #include <QMimeData>
26 #include <QPainter>
27 #include <QPointF>
28 #include <QStringList>
29 #include <QTreeWidget>
30 #include <QTreeWidgetItem>
31 #include <QWidget>
32 #include <QXmlStreamWriter>
33 
34 // QVCT
35 #include "QVCTRuntime.hpp"
40 
41 
42 //------------------------------------------------------------------------------
43 // CONSTRUCTORS / DESTRUCTOR
44 //------------------------------------------------------------------------------
45 
46 CRouteOverlay::CRouteOverlay( QWidget* _pqParent )
47  : COverlayBaseTree( _pqParent, tr("Routes") )
48 {
50 
51  // Tree widget
52  // ... columns
53  QTreeWidget::setColumnCount( 3 );
54  QTreeWidget::setColumnWidth( NAME, 184 );
55  // ... header
56  QTreeWidgetItem* __pqTreeWidgetItem = new QTreeWidgetItem();
57  __pqTreeWidgetItem->setText( NAME, tr("Name") );
58  __pqTreeWidgetItem->setIcon( VISIBLE, QIcon( ":icons/16x16/visible.png" ) );
59  __pqTreeWidgetItem->setIcon( SELECT, QIcon( ":icons/16x16/select.png" ) );
60  QTreeWidget::setHeaderItem( __pqTreeWidgetItem );
61  QTreeWidget::resizeColumnToContents( VISIBLE );
62  QTreeWidget::resizeColumnToContents( SELECT );
63  // ... top-level item
64  QTreeWidgetItem::setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable );
65  QTreeWidgetItem::setText( NAME, COverlay::qsName );
66  QTreeWidgetItem::setCheckState( VISIBLE, Qt::Checked );
67  // ... drag 'n drop
68  QTreeWidget::setDragDropMode( QAbstractItemView::InternalMove );
69 }
70 
72 {
74  clear();
75 }
76 
77 
78 //------------------------------------------------------------------------------
79 // METHODS: QTreeWidget (implement/override)
80 //------------------------------------------------------------------------------
81 
82 QStringList CRouteOverlay::mimeTypes() const
83 {
84  static const QStringList __qStringList( "application/qvct.routepoint" );
85  return __qStringList;
86 }
87 
88 QMimeData* CRouteOverlay::mimeData( const QList<QTreeWidgetItem*> _qListTreeWidgetItems ) const
89 {
90  QByteArray __qByteArray;
91  QDataStream __qDataStream( &__qByteArray, QIODevice::WriteOnly );
92  for( int __i=0; __i < _qListTreeWidgetItems.count(); __i++ )
93  {
94  QTreeWidgetItem* __pqTreeWidgetItem = _qListTreeWidgetItems.at( __i );
95  if( __pqTreeWidgetItem->type() != COverlayObject::ITEM ) continue;
96  CRoutePoint* __poRoutePoint = (CRoutePoint*)__pqTreeWidgetItem;
97  __poRoutePoint->serialize( __qDataStream );
98  }
99  QMimeData* __pqMimeData = new QMimeData();
100  __pqMimeData->setData( "application/qvct.routepoint", __qByteArray );
101  return __pqMimeData;
102 }
103 
104 bool CRouteOverlay::dropMimeData ( QTreeWidgetItem* _pqTreeWidgetItem, int _iIndex, const QMimeData* _pqMimeData, Qt::DropAction eAction )
105 {
106  if( !_pqTreeWidgetItem ) return false;
107  QByteArray __qByteArray = _pqMimeData->data( "application/qvct.routepoint" );
108  QDataStream __qDataStream( &__qByteArray, QIODevice::ReadOnly );
109  CRoutePoint* __poRoutePoint = 0;
110  while( !__qDataStream.atEnd() )
111  {
112  __poRoutePoint = new CRoutePoint( "#MIMEDATA#" );
113  __poRoutePoint->unserialize( __qDataStream );
114  _pqTreeWidgetItem->insertChild( _iIndex, __poRoutePoint );
115  }
116  if( __poRoutePoint ) QTreeWidget::setCurrentItem( __poRoutePoint );
117  return true;
118 }
119 
120 void CRouteOverlay::dropEvent( QDropEvent* _pqDropEvent )
121 {
122  QTreeWidget::dropEvent( _pqDropEvent );
125 }
126 
127 //------------------------------------------------------------------------------
128 // METHODS: COverlay (implement/override)
129 //------------------------------------------------------------------------------
130 
131 void CRouteOverlay::drawContent( const CChart* _poChart, QPainter* _pqPainter ) const
132 {
133  if( !bVisible ) return;
134  int __iCount = QTreeWidgetItem::childCount();
135  for( int __i = 0; __i < __iCount; __i++ )
136  ((CRouteContainer*)QTreeWidgetItem::child( __i ))->draw( _poChart, _pqPainter );
137 }
138 
139 void CRouteOverlay::showDetail( const QTreeWidgetItem* _pqTreeWidgetItem ) const
140 {
141  if( !_pqTreeWidgetItem ) return;
142  switch( _pqTreeWidgetItem->type() )
143  {
144 
146  {
147  CRouteContainer* __poRouteContainer = (CRouteContainer*)_pqTreeWidgetItem;
148  __poRouteContainer->showDetail();
149  }
150  break;
151 
153  {
154  CRoutePoint* __poRoutePoint = (CRoutePoint*)_pqTreeWidgetItem;
155  CChartTable* __poChartTable = QVCTRuntime::useChartTable();
156  if( __poRoutePoint->CDataPosition::operator!=( CDataPosition::UNDEFINED )
157  && ( __poChartTable->setPointerTarget( *__poRoutePoint )
158  || __poChartTable->extendPointerPath( *__poRoutePoint ) ) )
159  __poChartTable->showGeoPosition( *__poRoutePoint );
160  else
161  __poRoutePoint->showDetail();
162  }
163  break;
164 
165  default:;
166 
167  }
168 }
169 
170 void CRouteOverlay::setPosition( const QTreeWidgetItem* _pqTreeWidgetItem ) const
171 {
172  switch( _pqTreeWidgetItem->type() )
173  {
174 
176  if( _pqTreeWidgetItem->isExpanded() ) return; // NOTE: Expansion switch is handled *AFTER* this method is called
177  {
178  CDataPosition __oDataPositionLower, __oDataPositionUpper;
179  int __iCount = COverlayPoint::getPositionBox( (CRouteContainer*)_pqTreeWidgetItem, &__oDataPositionLower, &__oDataPositionUpper );
180  if( __iCount > 1 ) QVCTRuntime::useChartTable()->setScaleArea( __oDataPositionLower, __oDataPositionUpper, 0.9 );
181  else if( __iCount == 1 ) QVCTRuntime::useChartTable()->setGeoPosition( __oDataPositionLower );
182  }
183  break;
184 
186  {
187  CRoutePoint* __poRoutePoint = (CRoutePoint*)_pqTreeWidgetItem;
188  if( __poRoutePoint->CDataPosition::operator==( CDataPosition::UNDEFINED ) ) return;
189  QVCTRuntime::useChartTable()->setGeoPosition( *__poRoutePoint );
190  }
191  break;
192 
193  default:;
194 
195  }
196 }
197 
198 COverlayPoint* CRouteOverlay::matchScrPosition( const CChart* _poChart, const QPointF& _rqPointFScrPosition ) const
199 {
200  if( !bVisible ) return 0;
201  int __iCount = QTreeWidgetItem::childCount();
202  for( int __i = __iCount-1 ; __i >= 0; __i-- ) // we must go in the reverse order of CRouteOverlay::draw() to pick the correct (overlapping) item
203  {
204  CRouteContainer* __poRouteContainer = (CRouteContainer*)QTreeWidgetItem::child( __i );
205  COverlayPoint* __poOverlayPoint = __poRouteContainer->matchScrPosition( _poChart, _rqPointFScrPosition );
206  if( __poOverlayPoint ) return __poOverlayPoint;
207  }
208  return 0;
209 }
210 
211 
212 //------------------------------------------------------------------------------
213 // METHODS: COverlayBaseTree (implement/override)
214 //------------------------------------------------------------------------------
215 
216 void CRouteOverlay::onChange( QTreeWidgetItem* _pqTreeWidgetItem, int _iColumn )
217 {
218  bool bRedraw = false;
219  switch( _pqTreeWidgetItem->type() )
220  {
221 
223  {
224  switch( _iColumn )
225  {
226  case VISIBLE:
227  COverlay::setVisible( _pqTreeWidgetItem->checkState( VISIBLE ) == Qt::Checked );
228  bRedraw = true;
229  break;
230  default:;
231  }
232  }
233  break;
234 
236  {
237  CRouteContainer* __poRouteContainer = (CRouteContainer*)_pqTreeWidgetItem;
238  switch( _iColumn )
239  {
240  case NAME:
241  __poRouteContainer->setName( _pqTreeWidgetItem->text( NAME ) );
242  break;
243  case VISIBLE:
244  __poRouteContainer->setVisible( _pqTreeWidgetItem->checkState( VISIBLE ) == Qt::Checked );
245  bRedraw = true;
246  break;
247  default:;
248  }
249  }
250  break;
251 
253  {
254  CRoutePoint* __poRoutePoint = (CRoutePoint*)_pqTreeWidgetItem;
255  switch( _iColumn )
256  {
257  case NAME:
258  __poRoutePoint->setName( _pqTreeWidgetItem->text( NAME ) );
259  bRedraw = true;
260  break;
261  case VISIBLE:
262  __poRoutePoint->setVisible( _pqTreeWidgetItem->checkState( VISIBLE ) == Qt::Checked );
263  bRedraw = true;
264  break;
265  case SELECT:
266  __poRoutePoint->setMultiSelected( _pqTreeWidgetItem->checkState( SELECT ) == Qt::Checked );
267  bRedraw = true;
268  break;
269  default:;
270  }
271  }
272  break;
273 
274  default:;
275 
276  }
277 
278  // Redraw
279  if( bRedraw )
280  {
283  }
284 }
285 
286 
287 //------------------------------------------------------------------------------
288 // METHODS
289 //------------------------------------------------------------------------------
290 
291 //
292 // OTHER
293 //
294 
296 {
297  QColor __qColor = QVCTRuntime::useSettings()->getColorRoute();
298  __qColor.setAlpha( 128 );
299  qBrushMarker.setColor( __qColor );
300  __qColor.setAlpha( 192 );
301  qPenText.setColor( QColor::fromHsv( __qColor.hue(), __qColor.saturation(), std::min( 128, __qColor.value() ), 192 ) );
302  qPenMarker.setColor( __qColor );
303  qPenLine.setColor( __qColor );
304  qPenVector.setColor( __qColor );
305 }
306 
307 CRouteContainer* CRouteOverlay::addContainer( const QString& _rqsName )
308 {
309  CRouteContainer* __poRouteContainer = new CRouteContainer( _rqsName );
310  QTreeWidgetItem::addChild( __poRouteContainer );
311  QTreeWidgetItem::setExpanded( true );
312  return __poRouteContainer;
313 }
314 
316 {
317  int __iCount = QTreeWidgetItem::childCount();
318  if( !__iCount ) return addContainer( COverlay::newChildName( "Route", 1, true ) );
319  if( __iCount == 1 ) return (CRouteContainer*)QTreeWidgetItem::child( 0 );
320  // else: we must have the user choose among the available containers
321  COverlayObject* __poOverlayObject = 0;
322  CRouteContainerPickView* __poRouteContainerPickView = new CRouteContainerPickView( this, &__poOverlayObject );
323  __poRouteContainerPickView->exec();
324  delete __poRouteContainerPickView;
325  return (CRouteContainer*)__poOverlayObject;
326 }
327 
329 {
330  int __iCount = 0;
331  for( int __i = QTreeWidgetItem::childCount()-1; __i >= 0; __i-- )
332  __iCount += ((CRouteContainer*)QTreeWidgetItem::child( __i ))->deleteSelection();
333  return __iCount;
334 }
335 
337 {
338  QTreeWidgetItem* __pqTreeWidgetItem = QTreeWidgetItem::takeChild( 0 );
339  while( __pqTreeWidgetItem )
340  {
341  delete (CRouteContainer*)__pqTreeWidgetItem;
342  __pqTreeWidgetItem = QTreeWidgetItem::takeChild( 0 );
343  }
344 }
345 
346 CRouteContainer* CRouteOverlay::load( const QString& _rqsFilename )
347 {
348  QFileInfo __qFileInfo( _rqsFilename );
349  CRouteContainer* __poRouteContainer = 0;
350  QString __qsError;
351  do // error-catching context [begin]
352  {
353  // File
354  QFileInfo __qFileInfo( _rqsFilename );
355  QFile __qFile( __qFileInfo.absoluteFilePath() );
356  if( !__qFile.open( QIODevice::ReadOnly ) )
357  {
358  __qsError = QString( "Failed to open file (%1)" ).arg( __qFile.fileName() );
359  break;
360  }
361  QDomDocument __qDocDocument;
362  if( !__qDocDocument.setContent( &__qFile ) )
363  {
364  __qsError = QString( "Failed to parse XML (%1)" ).arg( __qFile.fileName() );
365  __qFile.close();
366  break;
367  }
368  __qFile.close();
369 
370  // XML
371  QDomElement __qDomElement = __qDocDocument.documentElement();
372  QString __qDocType = __qDomElement.nodeName();
373  if( __qDomElement.isNull() || ( __qDocType != "QVCT" && __qDocType != "gpx" ) )
374  {
375  __qsError = QString( "Invalid XML document type (%1); expected: 'QVCT' or 'gpx'" ).arg( __qFile.fileName() );
376  break;
377  }
378  if( __qDocType == "QVCT" ) parseQVCT( __qDomElement, &__poRouteContainer );
379  else if( __qDocType == "gpx" ) parseGPX( __qDomElement, &__poRouteContainer );
380  }
381  while( false ); // error-catching context [end]
382  if( !__qsError.isEmpty() )
383  {
384  qCritical( "ERROR[%s]: %s", Q_FUNC_INFO, qPrintable( __qsError ) );
385  QVCTRuntime::useMainWindow()->fileError( QVCT::OPEN, _rqsFilename );
386  return 0;
387  }
388  QTreeWidgetItem::setExpanded( true );
389  return __poRouteContainer;
390 }
391 
392 int CRouteOverlay::parseQVCT( const QDomElement& _rqDomElement, CRouteContainer** _ppoRouteContainer )
393 {
394  CRouteContainer* __poRouteContainer = 0;
395  int __iCount = 0;
396  for( QDomElement __qDomElement = _rqDomElement.firstChildElement( "Route" );
397  !__qDomElement.isNull();
398  __qDomElement = __qDomElement.nextSiblingElement( "Route" ) )
399  {
400  __iCount++;
401  QString __qsName = __qDomElement.attribute( "name" );
402  if( !__qsName.isEmpty() ) __qsName = COverlay::newChildName( __qsName );
403  else __qsName = COverlay::newChildName( tr("Route"), 1, true );
404  __poRouteContainer = new CRouteContainer( __qsName );
405  __poRouteContainer->parseQVCT( __qDomElement );
406  QTreeWidgetItem::addChild( __poRouteContainer );
407  }
408  if( _ppoRouteContainer ) *_ppoRouteContainer = __poRouteContainer;
409  return __iCount;
410 }
411 
412 int CRouteOverlay::parseGPX( const QDomElement& _rqDomElement, CRouteContainer** _ppoRouteContainer )
413 {
414  CRouteContainer* __poRouteContainer = 0;
415  int __iCount = 0;
416  for( QDomElement __qDomElement = _rqDomElement.firstChildElement( "rte" );
417  !__qDomElement.isNull();
418  __qDomElement = __qDomElement.nextSiblingElement( "rte" ) )
419  {
420  __iCount++;
421  QString __qsName = __qDomElement.firstChildElement( "name" ).text();
422  if( !__qsName.isEmpty() ) __qsName = COverlay::newChildName( __qsName );
423  else __qsName = COverlay::newChildName( tr("Route"), 1, true );
424  __poRouteContainer = new CRouteContainer( __qsName );
425  __poRouteContainer->parseGPX( __qDomElement );
426  QTreeWidgetItem::addChild( __poRouteContainer );
427  }
428  if( _ppoRouteContainer ) *_ppoRouteContainer = __poRouteContainer;
429  return __iCount;
430 }
431 
432 void CRouteOverlay::save( const QString& _rqsFilename, CRouteContainer* _poRouteContainer ) const
433 {
434  QFileInfo __qFileInfo( _rqsFilename );
435  QString __qsFormat = __qFileInfo.suffix();
436  if( __qsFormat != "qvct" && __qsFormat != "gpx" )
437  {
438  qCritical( "ERROR[%s]: Invalid file format/extention (%s); expected: 'qvct' or 'gpx'", Q_FUNC_INFO, qPrintable( __qsFormat ) );
439  return;
440  }
441 
442  // File [open]
443  QFile __qFile( __qFileInfo.absoluteFilePath() );
444  if( !__qFile.open( QIODevice::WriteOnly ) )
445  {
446  qCritical( "ERROR[%s]: Failed to open file (%s)", Q_FUNC_INFO, qPrintable( __qFile.fileName() ) );
447  return;
448  }
449 
450  // XML [start]
451  QXmlStreamWriter __qXmlStreamWriter( &__qFile );
452  __qXmlStreamWriter.setAutoFormatting( true );
453  __qXmlStreamWriter.writeStartDocument();
454 
455  // Data
456  if( __qsFormat == "qvct" ) dumpQVCT( __qXmlStreamWriter, _poRouteContainer );
457  else if( __qsFormat == "gpx" ) dumpGPX( __qXmlStreamWriter, _poRouteContainer );
458 
459  // XML [end]
460  __qXmlStreamWriter.writeEndDocument();
461 
462  // File [close]
463  __qFile.close();
464 }
465 
466 void CRouteOverlay::dumpQVCT( QXmlStreamWriter & _rqXmlStreamWriter, CRouteContainer* _poRouteContainer, bool _bProjectDump ) const
467 {
468  // Data
469  if( !_bProjectDump ) _rqXmlStreamWriter.writeStartElement( "QVCT" );
470  // ... containers
471  if( _poRouteContainer )
472  {
473  _poRouteContainer->dumpQVCT( _rqXmlStreamWriter, false );
474  }
475  else // no container given; assume selection dump or full dump
476  {
477  int __iCount = QTreeWidgetItem::childCount();
478  for( int __i = 0; __i < __iCount; __i++ )
479  ((CRouteContainer*)QTreeWidgetItem::child( __i ))->dumpQVCT( _rqXmlStreamWriter, !_bProjectDump );
480  }
481  // ... [end]
482  if( !_bProjectDump ) _rqXmlStreamWriter.writeEndElement(); // QVCT
483 }
484 
485 void CRouteOverlay::dumpGPX( QXmlStreamWriter & _rqXmlStreamWriter, CRouteContainer* _poRouteContainer ) const
486 {
487  // GPX format reference: see http://www.topografix.com/GPX/1/1/
488 
489  // Data
490  _rqXmlStreamWriter.writeStartElement( "gpx" );
491  _rqXmlStreamWriter.writeAttribute( "version", "1.1" );
492  _rqXmlStreamWriter.writeAttribute( "creator", "Qt Virtual Chart Table (QVCT)" );
493  // ... containers
494  if( _poRouteContainer )
495  {
496  _poRouteContainer->dumpGPX( _rqXmlStreamWriter, false );
497  }
498  else // no container given; assume selection dump
499  {
500  int __iCount = QTreeWidgetItem::childCount();
501  for( int __i = 0; __i < __iCount; __i++ )
502  ((CRouteContainer*)QTreeWidgetItem::child( __i ))->dumpGPX( _rqXmlStreamWriter, true );
503  }
504  // ... [end]
505  _rqXmlStreamWriter.writeEndElement(); // gpx
506 }
[UI] Virtual "chart table" (view)
Definition: CChartTable.hpp:55
bool extendPointerPath(const CDataPosition &_roGeoPosition)
Extends the pointer path; returns true if is was actually extended, false otherwise.
void setScaleArea(const CDataPosition &_roGeoPosition1, const CDataPosition &_roGeoPosition2, double _fdScaleCorrection=1.0)
Sets the reference scale factor to display the given (geographical) area (defined by its opposite cor...
void updateChart()
Update the (current) chart content (on screen)
bool setPointerTarget(const CDataPosition &_roGeoPosition)
Sets the pointer target's position; returns true if is was actually set, false otherwise.
void showGeoPosition(const CDataPosition &_roGeoPosition)
Shows the given (geographical) position on chart.
void setGeoPosition(const CDataPosition &_roGeoPosition, bool _bSkipCurrent=false)
Sets the reference chart (geographical) position.
[UI] Chart (view)
Definition: CChart.hpp:44
(Geographical) Position data [long,lat,elev]
static const CDataPosition UNDEFINED
Specific value for an undefined position.
void fileError(QVCT::EFileOperation _eFileOperation, const QString &_rqsFilename)
Displays a generic error message for an invalid file name and operation (open/save)
Generic overlay base (tree widget)
void destroy()
Prepare the underlying QTreeWidget for destruction.
void setMultiSelected(bool _bMultiSelected)
Sets this item's selection status.
Generic overlay object.
@ CONTAINER
Container.
@ OVERLAY
(Base) overlay
void setName(const QString &_rqsName)
Sets this object's name.
Generic overlay point.
static int getPositionBox(const QTreeWidgetItem *_pqTreeWidgetItem, CDataPosition *_poDataPositionLower, CDataPosition *_poDataPositionUpper, int _iIndexMin=0, int _iIndexMax=-1)
Returns the minimal geographical positions box containing the points in the given overlay/container.
void setVisible(bool _bVisible)
Sets the point's (marker) visibility status.
void setVisible(bool _bVisible)
Sets this overlay items' global visibility status.
Definition: COverlay.hpp:113
QString newChildName(const QString &_rqsName, int __iZeroPrefix=0, bool __bForceSuffix=false) const
Returns a valid name for a new sibling of this object.
Definition: COverlay.cpp:123
QPen qPenLine
QPen used to draw lines on this overlay.
Definition: COverlay.hpp:91
QPen qPenVector
QPen used to draw vectors on this overlay.
Definition: COverlay.hpp:94
QPen qPenText
QPen used to draw text on this overlay.
Definition: COverlay.hpp:76
bool bVisible
Overlay items' global visibility status.
Definition: COverlay.hpp:56
void forceRedraw()
Forces this overlay's rendering (not matter its cache content)
Definition: COverlay.hpp:115
QString qsName
Overlay name.
Definition: COverlay.hpp:52
QBrush qBrushMarker
QBrush used to draw markers on this overlay.
Definition: COverlay.hpp:79
QPen qPenMarker
QPen used to draw markers on this overlay.
Definition: COverlay.hpp:82
[UI] Route container's pick (select) view
[UI] Route overlay container
virtual void showDetail()
Displays this object's details (in the appropriate widget/view)
virtual COverlayPoint * matchScrPosition(const CChart *_poChart, const QPointF &_rqPointFScrPosition) const
Returns the overlay container's point that (first) matches the given screen position (0 if none is fo...
int parseGPX(const QDomElement &_rqDomElement)
Retrieves this object's content from the given GPX source (file)
void dumpQVCT(QXmlStreamWriter &_rqXmlStreamWriter, bool bOnlySelected=false) const
Stores this object's content to the given QVCT destination (file)
int parseQVCT(const QDomElement &_rqDomElement)
Retrieves this object's content from the given QVCT source (file)
void dumpGPX(QXmlStreamWriter &_rqXmlStreamWriter, bool bOnlySelected=false) const
Stores this object's content to the given GPX destination (file)
CRouteContainer * load(const QString &_rqsFilename)
Load this object's content from the given file and returns the last loaded container (0 if none)
void dumpQVCT(QXmlStreamWriter &_rqXmlStreamWriter, CRouteContainer *_poRouteContainer=0, bool _bProjectDump=false) const
Stores this object's content to the given QVCT destination (file)
virtual void showDetail(const QTreeWidgetItem *_pqTreeWidgetItem) const
Displays the given overlay object's details (in the appropriate widget/view)
virtual void onChange(QTreeWidgetItem *_pqTreeWidgetItem, int __iColumn)
Handles item (content) changes in the underlying QTreeWidget.
virtual COverlayPoint * matchScrPosition(const CChart *_poChart, const QPointF &_rqPointFScrPosition) const
Returns the overlay's point that (first) matches the given screen position (0 if none is found)
CRouteContainer * pickContainer()
Pick (select) a route (container) among the available ones (0 if none is selected)
CRouteOverlay(QWidget *_pqParent=0)
void clear()
Clear the entire content of this overlay.
CRouteContainer * addContainer(const QString &_rqsName)
Add a new route (container) to this overlay.
int parseGPX(const QDomElement &_rqDomElement, CRouteContainer **_ppoRouteContainer=0)
Retrieves this object's content from the given GPX source (file)
int deleteSelection()
Deletes selected items within this overlay's containers.
virtual void setPosition(const QTreeWidgetItem *_pqTreeWidgetItem) const
Centers the chart on the given overlay object's position.
@ VISIBLE
Route visibility status.
@ SELECT
Route selection status.
@ NAME
Route name.
void importSettings()
Imports settings from the application's global settings.
void save(const QString &_rqsFilename, CRouteContainer *_poRouteContainer=0) const
Save this object's content (container) to the given file (all selected items if no container is given...
virtual bool dropMimeData(QTreeWidgetItem *_pqTreeWidgetItem, int _iIndex, const QMimeData *_pqMimeData, Qt::DropAction eAction)
int parseQVCT(const QDomElement &_rqDomElement, CRouteContainer **_ppoRouteContainer=0)
Retrieves this object's content from the given QVCT source (file)
void dumpGPX(QXmlStreamWriter &_rqXmlStreamWriter, CRouteContainer *_poRouteContainer=0) const
Stores this object's content to the given GPX destination (file)
virtual void drawContent(const CChart *_poChart, QPainter *_pqPainter) const
Draws this overlay's content.
virtual QStringList mimeTypes() const
virtual void dropEvent(QDropEvent *_pqDropEvent)
virtual ~CRouteOverlay()
virtual QMimeData * mimeData(const QList< QTreeWidgetItem * > _qListTreeWidgetItems) const
[UI] Route overlay point (item) / waypoint
Definition: CRoutePoint.hpp:40
virtual void unserialize(QDataStream &_rqDataStream)
Unserializes (restore) this object's data from binary format.
Definition: CRoutePoint.cpp:75
virtual void serialize(QDataStream &_rqDataStream) const
Serializes (store) this object's data to binary format.
Definition: CRoutePoint.cpp:69
virtual void showDetail()
Displays this object's details (in the appropriate widget/view)
Definition: CRoutePoint.cpp:97
QColor getColorRoute()
[Color] Returns the route overlay's base color
Definition: CSettings.hpp:416
static CMainWindow * useMainWindow()
static CChartTable * useChartTable()
static CSettings * useSettings()
@ OPEN
Definition: QVCT.hpp:42