Qt Virtual Chart Table (QVCT)
CLandmarkPoint.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 CLandmarkPoint::CLandmarkPoint( 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( CLandmarkOverlay::NAME, qsName );
45  QTreeWidgetItem::setCheckState( CLandmarkOverlay::VISIBLE, Qt::Checked );
46  QTreeWidgetItem::setCheckState( CLandmarkOverlay::SELECT, Qt::Unchecked );
47 }
48 
49 CLandmarkPoint::CLandmarkPoint( const QString& _rqsName, const CDataPosition& _roDataPosition )
50  : COverlayPoint( _rqsName, _roDataPosition )
51  , qsType()
52  , qsDescription()
53  , qsComment()
54  , qsSymbol()
55  , qsUrl()
56 {
57  QTreeWidgetItem::setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled );
58  QTreeWidgetItem::setText( CLandmarkOverlay::NAME, qsName );
59  QTreeWidgetItem::setCheckState( CLandmarkOverlay::VISIBLE, Qt::Checked );
60  QTreeWidgetItem::setCheckState( CLandmarkOverlay::SELECT, Qt::Unchecked );
61 }
62 
63 
64 //------------------------------------------------------------------------------
65 // METHODS: COverlayObject (implement/override)
66 //------------------------------------------------------------------------------
67 
68 void CLandmarkPoint::serialize( QDataStream& _rqDataStream ) const
69 {
70  COverlayPoint::serialize( _rqDataStream );
71  _rqDataStream << qsType << qsDescription << qsComment << qsSymbol << qsUrl;
72 }
73 
74 void CLandmarkPoint::unserialize( QDataStream& _rqDataStream )
75 {
76  COverlayPoint::unserialize( _rqDataStream );
77  _rqDataStream >> qsType >> qsDescription >> qsComment >> qsSymbol >> qsUrl;
78  QTreeWidgetItem::setText( CLandmarkOverlay::NAME, qsName );
79 }
80 
81 void CLandmarkPoint::draw( const CChart* _poChart, QPainter* _pqPainter )
82 {
83  // Constant drawing resources
84  static const QPointF __qPointFSymbol(-32,-32);
85  static const QSize __qSizeSymbol(32,32);
86 
87  // Draw
88  if( CDataPosition::operator==( CDataPosition::UNDEFINED ) || !bVisible
89  || !_poChart->getDrawArea().contains( _poChart->toDrawPosition( *this ).toPoint() ) ) return;
90  COverlayObject* __poOverlayObjectSelected = QVCTRuntime::useChartTable()->getOverlayObjectSelected();
91  COverlayPoint::drawMarker( _poChart, _pqPainter, 0, __poOverlayObjectSelected == this || __poOverlayObjectSelected == QTreeWidgetItem::parent() );
92  if( QVCTRuntime::useSettings()->isVisibleSymbols() ) COverlayPoint::drawSymbol( _poChart, _pqPainter, qsSymbol );
93  COverlayPoint::drawTag( _poChart, _pqPainter );
94 }
95 
97 {
103 }
104 
106 {
107  CLandmarkPointEditView* __poLandmarkPointEditView = new CLandmarkPointEditView( this );
108  if( __poLandmarkPointEditView->exec() == QDialog::Accepted )
109  {
110  showDetail();
113  }
114  delete __poLandmarkPointEditView;
115 }
116 
117 
118 //------------------------------------------------------------------------------
119 // METHODS: COverlayPoint (implement/override)
120 //------------------------------------------------------------------------------
121 
122 bool CLandmarkPoint::matchScrPosition( const CChart* _poChart, const QPointF& _rqPointFScrPosition ) const
123 {
124  if( CDataPosition::operator==( CDataPosition::UNDEFINED ) || !bVisible
125  || !_poChart->getDrawArea().contains( _poChart->toDrawPosition( *this ).toPoint() ) ) return false;
126  return COverlayPoint::matchScrPosition( _poChart, _rqPointFScrPosition );
127 }
128 
129 
130 //------------------------------------------------------------------------------
131 // METHODS
132 //------------------------------------------------------------------------------
133 
134 //
135 // SETTERS
136 //
137 
139 {
140  QTreeWidgetItem::setCheckState( CLandmarkOverlay::SELECT, QTreeWidgetItem::checkState( CLandmarkOverlay::SELECT ) == Qt::Unchecked ? Qt::Checked : Qt::Unchecked );
141 }
142 
143 //
144 // OTHER
145 //
146 
147 void CLandmarkPoint::parseQVCT( const QDomElement& _rqDomElement )
148 {
149  COverlayVisibility::setVisibility( _rqDomElement.attribute( "visibility", "3" ).toInt() );
150  QTreeWidgetItem::setCheckState( CLandmarkOverlay::VISIBLE, bVisible ? Qt::Checked : Qt::Unchecked );
151  if( _rqDomElement.hasAttribute( "longitude" ) && _rqDomElement.hasAttribute( "longitude" ) )
152  {
153  COverlayPoint::setPosition( _rqDomElement.attribute( "longitude" ).toDouble(),
154  _rqDomElement.attribute( "latitude" ).toDouble(),
155  _rqDomElement.attribute( "elevation", QString::number( CDataPosition::UNDEFINED_ELEVATION, 'f' ) ).toDouble() );
156  }
157  qsType = _rqDomElement.attribute( "type" );
158  qsSymbol = _rqDomElement.attribute( "symbol" );
159  qsUrl = _rqDomElement.attribute( "url" );
160  qsDescription = _rqDomElement.firstChildElement( "Description" ).text();
161  qsComment = _rqDomElement.firstChildElement( "Comment" ).text();
162 }
163 
164 void CLandmarkPoint::parseGPX( const QDomElement& _rqDomElement )
165 {
166  // GPX format reference: see http://www.topografix.com/GPX/1/1/
167  if( _rqDomElement.hasAttribute( "lon" ) && _rqDomElement.hasAttribute( "lat" ) )
168  {
169  QString __qsElevation = _rqDomElement.firstChildElement( "ele" ).text();
170  if( __qsElevation.isEmpty() ) __qsElevation = QString::number( CDataPosition::UNDEFINED_ELEVATION, 'f' );
171  COverlayPoint::setPosition( _rqDomElement.attribute( "lon" ).toDouble(),
172  _rqDomElement.attribute( "lat" ).toDouble(),
173  __qsElevation.toDouble() );
174  }
175  qsType = _rqDomElement.firstChildElement( "type" ).text();
176  qsDescription = _rqDomElement.firstChildElement( "desc" ).text();
177  qsComment = _rqDomElement.firstChildElement( "cmt" ).text();
178  qsSymbol = _rqDomElement.firstChildElement( "sym" ).text();
179  qsUrl = _rqDomElement.firstChildElement( "link" ).attribute( "href" );
180 }
181 
182 void CLandmarkPoint::dumpQVCT( QXmlStreamWriter & _rqXmlStreamWriter ) const
183 {
184 
185  // Data
186  _rqXmlStreamWriter.writeStartElement( "Point" );
187  // ... name
188  if( !qsName.isEmpty() ) _rqXmlStreamWriter.writeAttribute( "name", qsName );
189  // ... visibility
190  _rqXmlStreamWriter.writeAttribute( "visibility", QString::number( COverlayVisibility::getVisibility() ) );
191  // ... position
192  _rqXmlStreamWriter.writeAttribute( "longitude", QString::number( CDataPosition::getLongitude() ) );
193  _rqXmlStreamWriter.writeAttribute( "latitude", QString::number( CDataPosition::getLatitude() ) );
194  // ... elevation
196  _rqXmlStreamWriter.writeAttribute( "elevation", QString::number( CDataPosition::getElevation() ) );
197  // ... type
198  if( !qsType.isEmpty() ) _rqXmlStreamWriter.writeAttribute( "type", qsType );
199  // ... symbol
200  if( !qsSymbol.isEmpty() ) _rqXmlStreamWriter.writeAttribute( "symbol", qsSymbol );
201  // ... url
202  if( !qsUrl.isEmpty() ) _rqXmlStreamWriter.writeAttribute( "url", qsUrl );
203  // ... description
204  if( !qsDescription.isEmpty() )
205  {
206  _rqXmlStreamWriter.writeStartElement( "Description" );
207  _rqXmlStreamWriter.writeCDATA( qsDescription );
208  _rqXmlStreamWriter.writeEndElement(); // Description
209  }
210  // ... comment
211  if( !qsComment.isEmpty() )
212  {
213  _rqXmlStreamWriter.writeStartElement( "Comment" );
214  _rqXmlStreamWriter.writeCDATA( qsComment );
215  _rqXmlStreamWriter.writeEndElement(); // Comment
216  }
217  // ... [end]
218  _rqXmlStreamWriter.writeEndElement(); // Point
219 }
220 
221 void CLandmarkPoint::dumpGPX( QXmlStreamWriter & _rqXmlStreamWriter ) const
222 {
223  // GPX format reference: see http://www.topografix.com/GPX/1/1/
224 
225  // Data
226  _rqXmlStreamWriter.writeStartElement( "wpt" );
227  // ... position
228  _rqXmlStreamWriter.writeAttribute( "lon", QString::number( CDataPosition::getLongitude() ) );
229  _rqXmlStreamWriter.writeAttribute( "lat", QString::number( CDataPosition::getLatitude() ) );
230  // ... name
231  if( !qsName.isEmpty() )
232  {
233  _rqXmlStreamWriter.writeStartElement( "name" );
234  _rqXmlStreamWriter.writeCharacters( qsName );
235  _rqXmlStreamWriter.writeEndElement(); // name
236  }
237  // ... elevation
239  {
240  _rqXmlStreamWriter.writeStartElement( "ele" );
241  _rqXmlStreamWriter.writeCharacters( QString::number( CDataPosition::getElevation() ) );
242  _rqXmlStreamWriter.writeEndElement(); // ele
243  }
244  // ... type
245  if( !qsType.isEmpty() )
246  {
247  _rqXmlStreamWriter.writeStartElement( "type" );
248  _rqXmlStreamWriter.writeCharacters( qsType );
249  _rqXmlStreamWriter.writeEndElement(); // type
250  }
251  // ... description
252  if( !qsDescription.isEmpty() )
253  {
254  _rqXmlStreamWriter.writeStartElement( "desc" );
255  _rqXmlStreamWriter.writeCDATA( qsDescription );
256  _rqXmlStreamWriter.writeEndElement(); // desc
257  }
258  // ... comment
259  if( !qsComment.isEmpty() )
260  {
261  _rqXmlStreamWriter.writeStartElement( "cmt" );
262  _rqXmlStreamWriter.writeCDATA( qsComment );
263  _rqXmlStreamWriter.writeEndElement(); // cmt
264  }
265  // ... symbol
266  if( !qsSymbol.isEmpty() )
267  {
268  _rqXmlStreamWriter.writeStartElement( "sym" );
269  _rqXmlStreamWriter.writeCharacters( qsSymbol );
270  _rqXmlStreamWriter.writeEndElement(); // sym
271  }
272  // ... url
273  if( !qsUrl.isEmpty() )
274  {
275  _rqXmlStreamWriter.writeStartElement( "link" );
276  _rqXmlStreamWriter.writeAttribute( "href", qsUrl );
277  _rqXmlStreamWriter.writeEndElement(); // link
278  }
279  // ... [end]
280  _rqXmlStreamWriter.writeEndElement(); // wpt
281 }
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.
@ SELECT
Landmark selection status.
@ NAME
Landmark name.
@ VISIBLE
Landmark visibility status.
virtual void refreshContent()
Refreshes the content of the underlying widget.
[UI] Landmark item's edit view
void dumpGPX(QXmlStreamWriter &_rqXmlStreamWriter) const
Stores this object's content to the given GPX destination (file)
QString qsType
Landmark's type.
void parseGPX(const QDomElement &_rqDomElement)
Retrieves this object's content from the given GPX source (file)
QString qsDescription
Landmark's description.
QString qsSymbol
Landmark's symbol.
virtual void showEdit()
Displays this object's edit widget/view.
void toggleMultiSelected()
Toggles this landmark's selection status.
QString qsUrl
Landmark's URL.
virtual void showDetail()
Displays this object's details (in the appropriate widget/view)
virtual void draw(const CChart *_poChart, QPainter *_pqPainter)
Draws this object (itself or its content)
CLandmarkPoint(const QString &_rqsName)
virtual void unserialize(QDataStream &_rqDataStream)
Unserializes (restore) this object's data from binary format.
void dumpQVCT(QXmlStreamWriter &_rqXmlStreamWriter) const
Stores this object's content to the given QVCT destination (file)
QString qsComment
Landmark's comment.
virtual bool matchScrPosition(const CChart *_poChart, const QPointF &_rqPointFScrPosition) const
Returns whether this point matches the given screen position.
void parseQVCT(const QDomElement &_rqDomElement)
Retrieves this object's content from the given QVCT source (file)
virtual void serialize(QDataStream &_rqDataStream) const
Serializes (store) this object's data to binary format.
void switchView(EView eView)
Displays the requested container/item details (switching to the appropriate widget)
@ LANDMARK_POINT
Landmark point.
@ LANDMARK
Landmark 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.
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
static COverlayDetailView * useOverlayDetailView()
static CLandmarkPointDetailView * useLandmarkPointDetailView()
static COverlayListView * useOverlayListView()
static CChartTable * useChartTable()
static CSettings * useSettings()
static CLandmarkOverlay * useLandmarkOverlay()