21 #include <QDataStream>
22 #include <QDomDocument>
28 #include <QStringList>
29 #include <QTreeWidget>
30 #include <QTreeWidgetItem>
32 #include <QXmlStreamWriter>
53 QTreeWidget::setColumnCount( 3 );
54 QTreeWidget::setColumnWidth(
NAME, 184 );
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 );
64 QTreeWidgetItem::setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable );
66 QTreeWidgetItem::setCheckState(
VISIBLE, Qt::Checked );
68 QTreeWidget::setDragDropMode( QAbstractItemView::InternalMove );
84 static const QStringList __qStringList(
"application/qvct.trackpoint" );
90 QByteArray __qByteArray;
91 QDataStream __qDataStream( &__qByteArray, QIODevice::WriteOnly );
92 for(
int __i=0; __i < _qListTreeWidgetItems.count(); __i++ )
94 QTreeWidgetItem* __pqTreeWidgetItem = _qListTreeWidgetItems.at( __i );
96 ((
CTrackPoint*)__pqTreeWidgetItem)->serialize( __qDataStream );
98 QMimeData* __pqMimeData =
new QMimeData();
99 __pqMimeData->setData(
"application/qvct.trackpoint", __qByteArray );
105 if( !_pqTreeWidgetItem )
return false;
106 QByteArray __qByteArray = _pqMimeData->data(
"application/qvct.trackpoint" );
107 QDataStream __qDataStream( &__qByteArray, QIODevice::ReadOnly );
109 while( !__qDataStream.atEnd() )
113 _pqTreeWidgetItem->insertChild( _iIndex, __poTrackPoint );
115 if( __poTrackPoint ) QTreeWidget::setCurrentItem( __poTrackPoint );
121 QTreeWidget::dropEvent( _pqDropEvent );
133 int __iCount = QTreeWidgetItem::childCount();
134 for(
int __i = 0; __i < __iCount; __i++ )
135 ((
CTrackContainer*)QTreeWidgetItem::child( __i ))->draw( _poChart, _pqPainter );
140 if( !_pqTreeWidgetItem )
return;
141 switch( _pqTreeWidgetItem->type() )
178 switch( _pqTreeWidgetItem->type() )
182 if( _pqTreeWidgetItem->isExpanded() )
return;
185 CDataPosition __oDataPositionLower( 180, 90, 999999 ), __oDataPositionUpper( -180, -90, -999999 );
187 int __iCount = __poTrackContainer->childCount();
188 for(
int __i = 0; __i < __iCount; __i++ )
190 CDataPosition __oDataPositionLower_aux, __oDataPositionUpper_aux;
192 if( __iCountBox_aux )
194 __iCountBox += __iCountBox_aux;
195 __oDataPositionLower.setPosition( std::min( __oDataPositionLower.getLongitude(), __oDataPositionLower_aux.
getLongitude() ),
196 std::min( __oDataPositionLower.getLatitude(), __oDataPositionLower_aux.
getLatitude() ),
197 std::min( __oDataPositionLower.getElevation(), __oDataPositionLower_aux.
getElevation() ) );
209 if( _pqTreeWidgetItem->isExpanded() )
return;
234 int __iCount = QTreeWidgetItem::childCount();
235 for(
int __i = __iCount-1 ; __i >= 0; __i-- )
239 if( __poOverlayPoint )
return __poOverlayPoint;
251 bool bRedraw =
false;
252 switch( _pqTreeWidgetItem->type() )
274 __poTrackContainer->
setName( _pqTreeWidgetItem->text(
NAME ) );
277 __poTrackContainer->
setVisible( _pqTreeWidgetItem->checkState(
VISIBLE ) == Qt::Checked );
291 __poTrackSubContainer->
setVisible( _pqTreeWidgetItem->checkState(
VISIBLE ) == Qt::Checked );
305 __poTrackPoint->
setName( _pqTreeWidgetItem->text(
NAME ) );
309 __poTrackPoint->
setVisible( _pqTreeWidgetItem->checkState(
VISIBLE ) == Qt::Checked );
345 __qColor.setAlpha( 128 );
347 __qColor.setAlpha( 192 );
348 qPenText.setColor( QColor::fromHsv( __qColor.hue(), __qColor.saturation(), std::min( 128, __qColor.value() ), 192 ) );
356 int __iCount = QTreeWidgetItem::childCount();
357 for(
int __i = 0; __i < __iCount; __i++ )
360 if( __poTrackContainer->
getName() == _rqsName )
return __poTrackContainer;
374 QTreeWidgetItem::addChild( __poTrackContainer );
375 QTreeWidgetItem::setExpanded(
true );
376 return __poTrackContainer;
382 for(
int __i = QTreeWidgetItem::childCount()-1; __i >= 0; __i-- )
383 __iCount += ((
CTrackContainer*)QTreeWidgetItem::child( __i ))->deleteSelection();
389 QTreeWidgetItem* __pqTreeWidgetItem = QTreeWidgetItem::takeChild( 0 );
390 while( __pqTreeWidgetItem )
393 __pqTreeWidgetItem = QTreeWidgetItem::takeChild( 0 );
399 QFileInfo __qFileInfo( _rqsFilename );
405 QFileInfo __qFileInfo( _rqsFilename );
406 QFile __qFile( __qFileInfo.absoluteFilePath() );
407 if( !__qFile.open( QIODevice::ReadOnly ) )
409 __qsError = QString(
"Failed to open file (%1)" ).arg( __qFile.fileName() );
412 QDomDocument __qDocDocument;
413 if( !__qDocDocument.setContent( &__qFile ) )
415 __qsError = QString(
"Failed to parse XML (%1)" ).arg( __qFile.fileName() );
422 QDomElement __qDomElement = __qDocDocument.documentElement();
423 QString __qDocType = __qDomElement.nodeName();
424 if( __qDomElement.isNull() || ( __qDocType !=
"QVCT" && __qDocType !=
"gpx" ) )
426 __qsError = QString(
"Invalid XML document type (%1); expected: 'QVCT' or 'gpx'" ).arg( __qFile.fileName() );
429 if( __qDocType ==
"QVCT" )
parseQVCT( __qDomElement, &__poTrackContainer );
430 else if( __qDocType ==
"gpx" )
parseGPX( __qDomElement, &__poTrackContainer );
433 if( !__qsError.isEmpty() )
435 qCritical(
"ERROR[%s]: %s", Q_FUNC_INFO, qPrintable( __qsError ) );
439 QTreeWidgetItem::setExpanded(
true );
440 return __poTrackContainer;
447 for( QDomElement __qDomElement = _rqDomElement.firstChildElement(
"Track" ); !__qDomElement.isNull(); __qDomElement = __qDomElement.nextSiblingElement(
"Track" ) )
450 QString __qsName = __qDomElement.attribute(
"name" );
454 __poTrackContainer->
parseQVCT( __qDomElement );
455 QTreeWidgetItem::addChild( __poTrackContainer );
457 if( _ppoTrackContainer ) *_ppoTrackContainer = __poTrackContainer;
465 for( QDomElement __qDomElement = _rqDomElement.firstChildElement(
"trk" ); !__qDomElement.isNull(); __qDomElement = __qDomElement.nextSiblingElement(
"trk" ) )
468 QString __qsName = __qDomElement.firstChildElement(
"name" ).text();
472 __poTrackContainer->
parseGPX( __qDomElement );
473 QTreeWidgetItem::addChild( __poTrackContainer );
475 if( _ppoTrackContainer ) *_ppoTrackContainer = __poTrackContainer;
481 QFileInfo __qFileInfo( _rqsFilename );
482 QString __qsFormat = __qFileInfo.suffix();
483 if( __qsFormat !=
"qvct" && __qsFormat !=
"gpx" )
485 qCritical(
"ERROR[%s]: Invalid file format/extention (%s); expected: 'qvct' or 'gpx'", Q_FUNC_INFO, qPrintable( __qsFormat ) );
490 QFile __qFile( __qFileInfo.absoluteFilePath() );
491 if( !__qFile.open( QIODevice::WriteOnly ) )
493 qCritical(
"ERROR[%s]: Failed to open file (%s)", Q_FUNC_INFO, qPrintable( __qFile.fileName() ) );
498 QXmlStreamWriter __qXmlStreamWriter( &__qFile );
499 __qXmlStreamWriter.setAutoFormatting(
true );
500 __qXmlStreamWriter.writeStartDocument();
503 if( __qsFormat ==
"qvct" )
dumpQVCT( __qXmlStreamWriter, _poTrackContainer );
504 else if( __qsFormat ==
"gpx" )
dumpGPX( __qXmlStreamWriter, _poTrackContainer );
507 __qXmlStreamWriter.writeEndDocument();
516 if( !_bProjectDump ) _rqXmlStreamWriter.writeStartElement(
"QVCT" );
518 if( _poTrackContainer )
520 _poTrackContainer->
dumpQVCT( _rqXmlStreamWriter,
false );
524 int __iCount = QTreeWidgetItem::childCount();
525 for(
int __i = 0; __i < __iCount; __i++ )
526 ((
CTrackContainer*)QTreeWidgetItem::child( __i ))->dumpQVCT( _rqXmlStreamWriter, !_bProjectDump );
529 if( !_bProjectDump ) _rqXmlStreamWriter.writeEndElement();
537 _rqXmlStreamWriter.writeStartElement(
"gpx" );
538 _rqXmlStreamWriter.writeAttribute(
"version",
"1.1" );
539 _rqXmlStreamWriter.writeAttribute(
"creator",
"Qt Virtual Chart Table (QVCT)" );
541 if( _poTrackContainer )
543 _poTrackContainer->
dumpGPX( _rqXmlStreamWriter,
false );
547 int __iCount = QTreeWidgetItem::childCount();
548 for(
int __i = 0; __i < __iCount; __i++ )
549 ((
CTrackContainer*)QTreeWidgetItem::child( __i ))->dumpGPX( _rqXmlStreamWriter,
true );
552 _rqXmlStreamWriter.writeEndElement();
[UI] Virtual "chart table" (view)
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.
(Geographical) Position data [long,lat,elev]
double getLongitude() const
Returns this position's longitude, in degrees.
double getElevation() const
Returns this position's elevation, in meters.
double getLatitude() const
Returns this position's latitude, in degrees.
static const CDataPosition UNDEFINED
Specific value for an undefined position.
void setPosition(double _fdLongitude, double _fdLatitude, double _fdElevation=UNDEFINED_ELEVATION)
Sets new coordinates.
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.
@ SUBCONTAINER
Sub-container.
QString getName() const
Returns this object's name.
void setName(const QString &_rqsName)
Sets this object's name.
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.
QString newChildName(const QString &_rqsName, int __iZeroPrefix=0, bool __bForceSuffix=false) const
Returns a valid name for a new sibling of this object.
QPen qPenLine
QPen used to draw lines on this overlay.
QPen qPenVector
QPen used to draw vectors on this overlay.
QPen qPenText
QPen used to draw text on this overlay.
bool bVisible
Overlay items' global visibility status.
void forceRedraw()
Forces this overlay's rendering (not matter its cache content)
QString qsName
Overlay name.
QBrush qBrushMarker
QBrush used to draw markers on this overlay.
QPen qPenMarker
QPen used to draw markers on this overlay.
QColor getColorTrack()
[Color] Returns the track overlay's base color
[UI] Track overlay container
int parseGPX(const QDomElement &_rqDomElement)
Retrieves this object's content from the given GPX source (file)
CTrackSubContainer * pickSubContainer()
Returns the last/current sub-container of this container.
void dumpQVCT(QXmlStreamWriter &_rqXmlStreamWriter, bool bOnlySelected=false) const
Stores this object's content to the given QVCT destination (file)
virtual void showDetail()
Displays this object's details (in the appropriate widget/view)
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)
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...
@ VISIBLE
Track visibility status.
@ SELECT
Track selection status.
CTrackOverlay(QWidget *_pqParent=0)
void clear()
Clear the entire content of this overlay.
virtual void dropEvent(QDropEvent *_pqDropEvent)
CTrackContainer * addContainer(const QString &_rqsName)
Add a new track (container) to this overlay.
virtual void drawContent(const CChart *_poChart, QPainter *_pqPainter) const
Draws this overlay's content.
CTrackContainer * pickContainer(const QString &_rqsName)
Returns a track (container) matching the given name.
void dumpQVCT(QXmlStreamWriter &_rqXmlStreamWriter, CTrackContainer *_poTrackContainer=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)
void dumpGPX(QXmlStreamWriter &_rqXmlStreamWriter, CTrackContainer *_poTrackContainer=0) const
Stores this object's content to the given GPX destination (file)
int parseGPX(const QDomElement &_rqDomElement, CTrackContainer **_ppoTrackContainer=0)
Retrieves this object's content from the given GPX source (file)
virtual bool dropMimeData(QTreeWidgetItem *_pqTreeWidgetItem, int _iIndex, const QMimeData *_pqMimeData, Qt::DropAction eAction)
CTrackSubContainer * pickSubContainer(const QString &_rqsName)
Returns the last/current segment (sub-container) of the track (container) matching the given name.
virtual QStringList mimeTypes() const
int deleteSelection()
Deletes selected items within this overlay's containers.
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)
virtual void onChange(QTreeWidgetItem *_pqTreeWidgetItem, int __iColumn)
Handles item (content) changes in the underlying QTreeWidget.
void importSettings()
Imports settings from the application's global settings.
void save(const QString &_rqsFilename, CTrackContainer *_poTrackContainer=0) const
Save this object's content (container) to the given file (all selected items if no container is given...
CTrackContainer * load(const QString &_rqsFilename)
Load this object's content from the given file and returns the last loaded container (0 if none)
int parseQVCT(const QDomElement &_rqDomElement, CTrackContainer **_ppoTrackContainer=0)
Retrieves this object's content from the given QVCT source (file)
virtual void setPosition(const QTreeWidgetItem *_pqTreeWidgetItem) const
Centers the chart on the given overlay object's position.
virtual QMimeData * mimeData(const QList< QTreeWidgetItem * > _qListTreeWidgetItems) const
[UI] Track overlay point (item)
virtual void unserialize(QDataStream &_rqDataStream)
Unserializes (restore) this object's data from binary format.
virtual void showDetail()
Displays this object's details (in the appropriate widget/view)
[UI] Track overlay sub-container
virtual void showDetail()
Displays this object's details (in the appropriate widget/view)
static CMainWindow * useMainWindow()
static CChartTable * useChartTable()
static CSettings * useSettings()