Qt Virtual Chart Table (QVCT)
CRoutePoint.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 <QDomElement> // QtXml module
21 #include <QPainter>
22 #include <QPointF>
23 
24 // QVCT
25 #include "QVCTRuntime.hpp"
26 #include "charts/CChart.hpp"
29 
30 
31 //------------------------------------------------------------------------------
32 // CONSTRUCTORS / DESTRUCTOR
33 //------------------------------------------------------------------------------
34 
35 CRoutePoint::CRoutePoint( const QString& _rqsName )
36  : COverlayPoint( _rqsName )
37  , qsType()
38  , qsDescription()
39  , qsComment()
40  , qsSymbol()
41  , qsUrl()
42 {
43  QTreeWidgetItem::setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled );
44  QTreeWidgetItem::setText( CRouteOverlay::NAME, qsName );
45  QTreeWidgetItem::setCheckState( CRouteOverlay::VISIBLE, Qt::Checked );
46  QTreeWidgetItem::setCheckState( CRouteOverlay::SELECT, Qt::Unchecked );
47  bVisibleRouting = true;
48 }
49 
50 CRoutePoint::CRoutePoint( const QString& _rqsName, const CDataPosition& _roDataPosition )
51  : COverlayPoint( _rqsName, _roDataPosition )
52  , qsType()
53  , qsDescription()
54  , qsComment()
55  , qsSymbol()
56  , qsUrl()
57 {
58  QTreeWidgetItem::setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled );
59  QTreeWidgetItem::setText( CRouteOverlay::NAME, qsName );
60  QTreeWidgetItem::setCheckState( CRouteOverlay::VISIBLE, Qt::Checked );
61  QTreeWidgetItem::setCheckState( CRouteOverlay::SELECT, Qt::Unchecked );
62 }
63 
64 
65 //------------------------------------------------------------------------------
66 // METHODS: COverlayObject (implement/override)
67 //------------------------------------------------------------------------------
68 
69 void CRoutePoint::serialize( QDataStream& _rqDataStream ) const
70 {
71  COverlayPoint::serialize( _rqDataStream );
72  _rqDataStream << qsType << qsDescription << qsComment << qsSymbol << qsUrl;
73 }
74 
75 void CRoutePoint::unserialize( QDataStream& _rqDataStream )
76 {
77  COverlayPoint::unserialize( _rqDataStream );
78  _rqDataStream >> qsType >> qsDescription >> qsComment >> qsSymbol >> qsUrl;
79  QTreeWidgetItem::setText( CRouteOverlay::NAME, qsName );
80 }
81 
82 void CRoutePoint::draw( const CChart* _poChart, QPainter* _pqPainter )
83 {
84  // Constant drawing resources
85  static const QPointF __qPointFSymbol(-32,-32);
86  static const QSize __qSizeSymbol(32,32);
87 
88  // Draw
89  if( CDataPosition::operator==( CDataPosition::UNDEFINED ) || !bVisible
90  || !_poChart->getDrawArea().contains( _poChart->toDrawPosition( *this ).toPoint() ) ) return;
91  COverlayObject* __poOverlayObjectSelected = QVCTRuntime::useChartTable()->getOverlayObjectSelected();
92  COverlayPoint::drawMarker( _poChart, _pqPainter, 0, __poOverlayObjectSelected == this || __poOverlayObjectSelected == QTreeWidgetItem::parent() );
93  if( QVCTRuntime::useSettings()->isVisibleSymbols() ) COverlayPoint::drawSymbol( _poChart, _pqPainter, qsSymbol );
94  COverlayPoint::drawTag( _poChart, _pqPainter );
95 }
96 
98 {
104 }
105 
107 {
108  CRoutePointEditView* __poRoutePointEditView = new CRoutePointEditView( this );
109  if( __poRoutePointEditView->exec() == QDialog::Accepted )
110  {
111  showDetail();
114  }
115  delete __poRoutePointEditView;
116 }
117 
118 
119 //------------------------------------------------------------------------------
120 // METHODS: COverlayPoint (implement/override)
121 //------------------------------------------------------------------------------
122 
123 bool CRoutePoint::matchScrPosition( const CChart* _poChart, const QPointF& _rqPointFScrPosition ) const
124 {
125  if( CDataPosition::operator==( CDataPosition::UNDEFINED ) || !bVisible
126  || !_poChart->getDrawArea().contains( _poChart->toDrawPosition( *this ).toPoint() ) ) return false;
127  return COverlayPoint::matchScrPosition( _poChart, _rqPointFScrPosition );
128 }
129 
130 
131 //------------------------------------------------------------------------------
132 // METHODS
133 //------------------------------------------------------------------------------
134 
135 //
136 // SETTERS
137 //
138 
140 {
141  QTreeWidgetItem::setCheckState( CRouteOverlay::SELECT, QTreeWidgetItem::checkState( CRouteOverlay::SELECT ) == Qt::Unchecked ? Qt::Checked : Qt::Unchecked );
142 }
143 
144 //
145 // OTHER
146 //
147 
148 void CRoutePoint::parseQVCT( const QDomElement& _rqDomElement )
149 {
150  COverlayVisibility::setVisibility( _rqDomElement.attribute( "visibility", "19" ).toInt() );
151  QTreeWidgetItem::setCheckState( CRouteOverlay::VISIBLE, bVisible ? Qt::Checked : Qt::Unchecked );
152  if( _rqDomElement.hasAttribute( "longitude" ) && _rqDomElement.hasAttribute( "longitude" ) )
153  {
154  COverlayPoint::setPosition( _rqDomElement.attribute( "longitude" ).toDouble(),
155  _rqDomElement.attribute( "latitude" ).toDouble(),
156  _rqDomElement.attribute( "elevation", QString::number( CDataPosition::UNDEFINED_ELEVATION, 'f' ) ).toDouble() );
157  }
158  qsType = _rqDomElement.attribute( "type" );
159  qsSymbol = _rqDomElement.attribute( "symbol" );
160  qsUrl = _rqDomElement.attribute( "url" );
161  qsDescription = _rqDomElement.firstChildElement( "Description" ).text();
162  qsComment = _rqDomElement.firstChildElement( "Comment" ).text();
163 }
164 
165 void CRoutePoint::parseGPX( const QDomElement& _rqDomElement )
166 {
167  // GPX format reference: see http://www.topografix.com/GPX/1/1/
168  if( _rqDomElement.hasAttribute( "lon" ) && _rqDomElement.hasAttribute( "lat" ) )
169  {
170  QString __qsElevation = _rqDomElement.firstChildElement( "ele" ).text();
171  if( __qsElevation.isEmpty() ) __qsElevation = QString::number( CDataPosition::UNDEFINED_ELEVATION, 'f' );
172  COverlayPoint::setPosition( _rqDomElement.attribute( "lon" ).toDouble(),
173  _rqDomElement.attribute( "lat" ).toDouble(),
174  __qsElevation.toDouble() );
175  }
176  qsType = _rqDomElement.firstChildElement( "type" ).text();
177  qsDescription = _rqDomElement.firstChildElement( "desc" ).text();
178  qsComment = _rqDomElement.firstChildElement( "cmt" ).text();
179  qsSymbol = _rqDomElement.firstChildElement( "sym" ).text();
180  qsUrl = _rqDomElement.firstChildElement( "link" ).attribute( "href" );
181 }
182 
183 void CRoutePoint::dumpQVCT( QXmlStreamWriter & _rqXmlStreamWriter ) const
184 {
185 
186  // Data
187  _rqXmlStreamWriter.writeStartElement( "Point" );
188  // ... name
189  if( !qsName.isEmpty() ) _rqXmlStreamWriter.writeAttribute( "name", qsName );
190  // ... visibility
191  _rqXmlStreamWriter.writeAttribute( "visibility", QString::number( COverlayVisibility::getVisibility() ) );
192  // ... position
193  _rqXmlStreamWriter.writeAttribute( "longitude", QString::number( CDataPosition::getLongitude() ) );
194  _rqXmlStreamWriter.writeAttribute( "latitude", QString::number( CDataPosition::getLatitude() ) );
195  // ... elevation
197  _rqXmlStreamWriter.writeAttribute( "elevation", QString::number( CDataPosition::getElevation() ) );
198  // ... type
199  if( !qsType.isEmpty() ) _rqXmlStreamWriter.writeAttribute( "type", qsType );
200  // ... symbol
201  if( !qsSymbol.isEmpty() ) _rqXmlStreamWriter.writeAttribute( "symbol", qsSymbol );
202  // ... url
203  if( !qsUrl.isEmpty() ) _rqXmlStreamWriter.writeAttribute( "url", qsUrl );
204  // ... description
205  if( !qsDescription.isEmpty() )
206  {
207  _rqXmlStreamWriter.writeStartElement( "Description" );
208  _rqXmlStreamWriter.writeCDATA( qsDescription );
209  _rqXmlStreamWriter.writeEndElement(); // Description
210  }
211  // ... comment
212  if( !qsComment.isEmpty() )
213  {
214  _rqXmlStreamWriter.writeStartElement( "Comment" );
215  _rqXmlStreamWriter.writeCDATA( qsComment );
216  _rqXmlStreamWriter.writeEndElement(); // Comment
217  }
218  // ... [end]
219  _rqXmlStreamWriter.writeEndElement(); // Point
220 }
221 
222 void CRoutePoint::dumpGPX( QXmlStreamWriter & _rqXmlStreamWriter ) const
223 {
224  // GPX format reference: see http://www.topografix.com/GPX/1/1/
225 
226  // Data
227  _rqXmlStreamWriter.writeStartElement( "rtept" );
228  // ... position
229  _rqXmlStreamWriter.writeAttribute( "lon", QString::number( CDataPosition::getLongitude() ) );
230  _rqXmlStreamWriter.writeAttribute( "lat", QString::number( CDataPosition::getLatitude() ) );
231  // ... name
232  if( !qsName.isEmpty() )
233  {
234  _rqXmlStreamWriter.writeStartElement( "name" );
235  _rqXmlStreamWriter.writeCharacters( qsName );
236  _rqXmlStreamWriter.writeEndElement(); // name
237  }
238  // ... elevation
240  {
241  _rqXmlStreamWriter.writeStartElement( "ele" );
242  _rqXmlStreamWriter.writeCharacters( QString::number( CDataPosition::getElevation() ) );
243  _rqXmlStreamWriter.writeEndElement(); // ele
244  }
245  // ... type
246  if( !qsType.isEmpty() )
247  {
248  _rqXmlStreamWriter.writeStartElement( "type" );
249  _rqXmlStreamWriter.writeCharacters( qsType );
250  _rqXmlStreamWriter.writeEndElement(); // type
251  }
252  // ... description
253  if( !qsDescription.isEmpty() )
254  {
255  _rqXmlStreamWriter.writeStartElement( "desc" );
256  _rqXmlStreamWriter.writeCDATA( qsDescription );
257  _rqXmlStreamWriter.writeEndElement(); // desc
258  }
259  // ... comment
260  if( !qsComment.isEmpty() )
261  {
262  _rqXmlStreamWriter.writeStartElement( "cmt" );
263  _rqXmlStreamWriter.writeCDATA( qsComment );
264  _rqXmlStreamWriter.writeEndElement(); // cmt
265  }
266  // ... symbol
267  if( !qsSymbol.isEmpty() )
268  {
269  _rqXmlStreamWriter.writeStartElement( "sym" );
270  _rqXmlStreamWriter.writeCharacters( qsSymbol );
271  _rqXmlStreamWriter.writeEndElement(); // sym
272  }
273  // ... url
274  if( !qsUrl.isEmpty() )
275  {
276  _rqXmlStreamWriter.writeStartElement( "link" );
277  _rqXmlStreamWriter.writeAttribute( "href", qsUrl );
278  _rqXmlStreamWriter.writeEndElement(); // link
279  }
280  // ... [end]
281  _rqXmlStreamWriter.writeEndElement(); // rtept
282 }
COverlayObject * getOverlayObjectSelected() const
Returns the currently selected overlay object.
void updateChart()
Update the (current) chart content (on screen)
void setOverlayObjectSelected(COverlayObject *_poOverlayObject)
Sets the currently selected overlay object.
[UI] Chart (view)
Definition: CChart.hpp:44
QRectF getDrawArea() const
Returns the viewport draw area.
Definition: CChart.hpp:127
QPointF toDrawPosition(const CDataPosition &_roGeoPosition) const
Converts the given (geographical) position [long,lat,elev] to chart draw point [px].
Definition: CChart.cpp:192
(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.
static constexpr double UNDEFINED_ELEVATION
Specific value for an undefined elevation.
void switchView(EView eView)
Displays the requested container/item details (switching to the appropriate widget)
@ ROUTE
Route overlay.
void switchView(EView eView)
Displays the requested overlay (switching to the appropriate tab)
void setOverlayObject(COverlayObject *_poOverlayObject)
Sets the overlay object to be displayed (and refreshes the underlying widget)
Generic overlay object.
QString qsName
Object name.
Generic overlay point.
virtual bool matchScrPosition(const CChart *_poChart, const QPointF &_rqPointFScrPosition) const
Returns whether this point matches the given screen position.
virtual void drawSymbol(const CChart *_poChart, QPainter *_pqPainter, const QString &_rqsSymbol)
Draws the symbol (user-defined)
virtual void drawTag(const CChart *_poChart, QPainter *_pqPainter, ETagPosition _eTagPosition=TAG_AUTO, const CDataTimeValidity *_poDataTimeValidity=0, const CDataPositionValidity *_poDataPositionValidity=0)
Draws the tag (name)
virtual void drawMarker(const CChart *_poChart, QPainter *_pqPainter, const CDataPositionValidity *_poDataPositionValidity=0, bool _bSelected=false)
Draws the point (marker)
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.
bool bVisibleRouting
Routing's (data) visibility status.
void setVisibility(int _iVisibilityCode)
Sets the global (coded) visibility status.
bool bVisible
Global (marker) visibility status.
int getVisibility() const
Returns the global (coded) visibility status.
void forceRedraw()
Forces this overlay's rendering (not matter its cache content)
Definition: COverlay.hpp:115
@ VISIBLE
Route visibility status.
@ SELECT
Route selection status.
@ NAME
Route name.
virtual void refreshContent()
Refreshes the content of the underlying widget.
[UI] Route item's edit view
QString qsComment
Waypoint's comment.
Definition: CRoutePoint.hpp:52
virtual void unserialize(QDataStream &_rqDataStream)
Unserializes (restore) this object's data from binary format.
Definition: CRoutePoint.cpp:75
void dumpQVCT(QXmlStreamWriter &_rqXmlStreamWriter) const
Stores this object's content to the given QVCT destination (file)
virtual bool matchScrPosition(const CChart *_poChart, const QPointF &_rqPointFScrPosition) const
Returns whether this point matches the given screen position.
QString qsType
Waypoint's type.
Definition: CRoutePoint.hpp:48
CRoutePoint(const QString &_rqsName)
Definition: CRoutePoint.cpp:35
QString qsUrl
Waypoint's URL.
Definition: CRoutePoint.hpp:57
virtual void serialize(QDataStream &_rqDataStream) const
Serializes (store) this object's data to binary format.
Definition: CRoutePoint.cpp:69
virtual void showEdit()
Displays this object's edit widget/view.
void dumpGPX(QXmlStreamWriter &_rqXmlStreamWriter) const
Stores this object's content to the given GPX destination (file)
void parseQVCT(const QDomElement &_rqDomElement)
Retrieves this object's content from the given QVCT source (file)
virtual void showDetail()
Displays this object's details (in the appropriate widget/view)
Definition: CRoutePoint.cpp:97
void toggleMultiSelected()
Toggles this waypoint's selection status.
virtual void draw(const CChart *_poChart, QPainter *_pqPainter)
Draws this object (itself or its content)
Definition: CRoutePoint.cpp:82
QString qsSymbol
Waypoint's symbol.
Definition: CRoutePoint.hpp:55
QString qsDescription
Waypoint's description.
Definition: CRoutePoint.hpp:50
void parseGPX(const QDomElement &_rqDomElement)
Retrieves this object's content from the given GPX source (file)
static COverlayDetailView * useOverlayDetailView()
static CRoutePointDetailView * useRoutePointDetailView()
static CRouteOverlay * useRouteOverlay()
static COverlayListView * useOverlayListView()
static CChartTable * useChartTable()
static CSettings * useSettings()