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.routepoint" );
90 QByteArray __qByteArray;
91 QDataStream __qDataStream( &__qByteArray, QIODevice::WriteOnly );
92 for(
int __i=0; __i < _qListTreeWidgetItems.count(); __i++ )
94 QTreeWidgetItem* __pqTreeWidgetItem = _qListTreeWidgetItems.at( __i );
97 __poRoutePoint->
serialize( __qDataStream );
99 QMimeData* __pqMimeData =
new QMimeData();
100 __pqMimeData->setData(
"application/qvct.routepoint", __qByteArray );
106 if( !_pqTreeWidgetItem )
return false;
107 QByteArray __qByteArray = _pqMimeData->data(
"application/qvct.routepoint" );
108 QDataStream __qDataStream( &__qByteArray, QIODevice::ReadOnly );
110 while( !__qDataStream.atEnd() )
114 _pqTreeWidgetItem->insertChild( _iIndex, __poRoutePoint );
116 if( __poRoutePoint ) QTreeWidget::setCurrentItem( __poRoutePoint );
122 QTreeWidget::dropEvent( _pqDropEvent );
134 int __iCount = QTreeWidgetItem::childCount();
135 for(
int __i = 0; __i < __iCount; __i++ )
136 ((
CRouteContainer*)QTreeWidgetItem::child( __i ))->draw( _poChart, _pqPainter );
141 if( !_pqTreeWidgetItem )
return;
142 switch( _pqTreeWidgetItem->type() )
172 switch( _pqTreeWidgetItem->type() )
176 if( _pqTreeWidgetItem->isExpanded() )
return;
201 int __iCount = QTreeWidgetItem::childCount();
202 for(
int __i = __iCount-1 ; __i >= 0; __i-- )
206 if( __poOverlayPoint )
return __poOverlayPoint;
218 bool bRedraw =
false;
219 switch( _pqTreeWidgetItem->type() )
241 __poRouteContainer->
setName( _pqTreeWidgetItem->text(
NAME ) );
244 __poRouteContainer->
setVisible( _pqTreeWidgetItem->checkState(
VISIBLE ) == Qt::Checked );
258 __poRoutePoint->
setName( _pqTreeWidgetItem->text(
NAME ) );
262 __poRoutePoint->
setVisible( _pqTreeWidgetItem->checkState(
VISIBLE ) == Qt::Checked );
298 __qColor.setAlpha( 128 );
300 __qColor.setAlpha( 192 );
301 qPenText.setColor( QColor::fromHsv( __qColor.hue(), __qColor.saturation(), std::min( 128, __qColor.value() ), 192 ) );
310 QTreeWidgetItem::addChild( __poRouteContainer );
311 QTreeWidgetItem::setExpanded(
true );
312 return __poRouteContainer;
317 int __iCount = QTreeWidgetItem::childCount();
319 if( __iCount == 1 )
return (
CRouteContainer*)QTreeWidgetItem::child( 0 );
323 __poRouteContainerPickView->exec();
324 delete __poRouteContainerPickView;
331 for(
int __i = QTreeWidgetItem::childCount()-1; __i >= 0; __i-- )
332 __iCount += ((
CRouteContainer*)QTreeWidgetItem::child( __i ))->deleteSelection();
338 QTreeWidgetItem* __pqTreeWidgetItem = QTreeWidgetItem::takeChild( 0 );
339 while( __pqTreeWidgetItem )
342 __pqTreeWidgetItem = QTreeWidgetItem::takeChild( 0 );
348 QFileInfo __qFileInfo( _rqsFilename );
354 QFileInfo __qFileInfo( _rqsFilename );
355 QFile __qFile( __qFileInfo.absoluteFilePath() );
356 if( !__qFile.open( QIODevice::ReadOnly ) )
358 __qsError = QString(
"Failed to open file (%1)" ).arg( __qFile.fileName() );
361 QDomDocument __qDocDocument;
362 if( !__qDocDocument.setContent( &__qFile ) )
364 __qsError = QString(
"Failed to parse XML (%1)" ).arg( __qFile.fileName() );
371 QDomElement __qDomElement = __qDocDocument.documentElement();
372 QString __qDocType = __qDomElement.nodeName();
373 if( __qDomElement.isNull() || ( __qDocType !=
"QVCT" && __qDocType !=
"gpx" ) )
375 __qsError = QString(
"Invalid XML document type (%1); expected: 'QVCT' or 'gpx'" ).arg( __qFile.fileName() );
378 if( __qDocType ==
"QVCT" )
parseQVCT( __qDomElement, &__poRouteContainer );
379 else if( __qDocType ==
"gpx" )
parseGPX( __qDomElement, &__poRouteContainer );
382 if( !__qsError.isEmpty() )
384 qCritical(
"ERROR[%s]: %s", Q_FUNC_INFO, qPrintable( __qsError ) );
388 QTreeWidgetItem::setExpanded(
true );
389 return __poRouteContainer;
396 for( QDomElement __qDomElement = _rqDomElement.firstChildElement(
"Route" );
397 !__qDomElement.isNull();
398 __qDomElement = __qDomElement.nextSiblingElement(
"Route" ) )
401 QString __qsName = __qDomElement.attribute(
"name" );
405 __poRouteContainer->
parseQVCT( __qDomElement );
406 QTreeWidgetItem::addChild( __poRouteContainer );
408 if( _ppoRouteContainer ) *_ppoRouteContainer = __poRouteContainer;
416 for( QDomElement __qDomElement = _rqDomElement.firstChildElement(
"rte" );
417 !__qDomElement.isNull();
418 __qDomElement = __qDomElement.nextSiblingElement(
"rte" ) )
421 QString __qsName = __qDomElement.firstChildElement(
"name" ).text();
425 __poRouteContainer->
parseGPX( __qDomElement );
426 QTreeWidgetItem::addChild( __poRouteContainer );
428 if( _ppoRouteContainer ) *_ppoRouteContainer = __poRouteContainer;
434 QFileInfo __qFileInfo( _rqsFilename );
435 QString __qsFormat = __qFileInfo.suffix();
436 if( __qsFormat !=
"qvct" && __qsFormat !=
"gpx" )
438 qCritical(
"ERROR[%s]: Invalid file format/extention (%s); expected: 'qvct' or 'gpx'", Q_FUNC_INFO, qPrintable( __qsFormat ) );
443 QFile __qFile( __qFileInfo.absoluteFilePath() );
444 if( !__qFile.open( QIODevice::WriteOnly ) )
446 qCritical(
"ERROR[%s]: Failed to open file (%s)", Q_FUNC_INFO, qPrintable( __qFile.fileName() ) );
451 QXmlStreamWriter __qXmlStreamWriter( &__qFile );
452 __qXmlStreamWriter.setAutoFormatting(
true );
453 __qXmlStreamWriter.writeStartDocument();
456 if( __qsFormat ==
"qvct" )
dumpQVCT( __qXmlStreamWriter, _poRouteContainer );
457 else if( __qsFormat ==
"gpx" )
dumpGPX( __qXmlStreamWriter, _poRouteContainer );
460 __qXmlStreamWriter.writeEndDocument();
469 if( !_bProjectDump ) _rqXmlStreamWriter.writeStartElement(
"QVCT" );
471 if( _poRouteContainer )
473 _poRouteContainer->
dumpQVCT( _rqXmlStreamWriter,
false );
477 int __iCount = QTreeWidgetItem::childCount();
478 for(
int __i = 0; __i < __iCount; __i++ )
479 ((
CRouteContainer*)QTreeWidgetItem::child( __i ))->dumpQVCT( _rqXmlStreamWriter, !_bProjectDump );
482 if( !_bProjectDump ) _rqXmlStreamWriter.writeEndElement();
490 _rqXmlStreamWriter.writeStartElement(
"gpx" );
491 _rqXmlStreamWriter.writeAttribute(
"version",
"1.1" );
492 _rqXmlStreamWriter.writeAttribute(
"creator",
"Qt Virtual Chart Table (QVCT)" );
494 if( _poRouteContainer )
496 _poRouteContainer->
dumpGPX( _rqXmlStreamWriter,
false );
500 int __iCount = QTreeWidgetItem::childCount();
501 for(
int __i = 0; __i < __iCount; __i++ )
502 ((
CRouteContainer*)QTreeWidgetItem::child( __i ))->dumpGPX( _rqXmlStreamWriter,
true );
505 _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]
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.
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.
[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.
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 QMimeData * mimeData(const QList< QTreeWidgetItem * > _qListTreeWidgetItems) const
[UI] Route overlay point (item) / waypoint
virtual void unserialize(QDataStream &_rqDataStream)
Unserializes (restore) this object's data from binary format.
virtual void serialize(QDataStream &_rqDataStream) const
Serializes (store) this object's data to binary format.
virtual void showDetail()
Displays this object's details (in the appropriate widget/view)
QColor getColorRoute()
[Color] Returns the route overlay's base color
static CMainWindow * useMainWindow()
static CChartTable * useChartTable()
static CSettings * useSettings()