• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.12
  • kdeedu
  • marble
  • src
  • plugins
  • render
  • measure
MeasureToolPlugin.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2006-2007 Torsten Rahn <tackat@kde.org>
9 // Copyright 2007-2008 Inge Wallin <ingwa@kde.org>
10 // Copyright 2007-2008 Carlos Licea <carlos.licea@kdemail.net>
11 // Copyright 2011 Michael Henning <mikehenning@eclipse.net>
12 // Copyright 2011 Valery Kharitonov <kharvd@gmail.com>
13 // Copyright 2012 Mohammed Nafees <nafees.technocool@gmail.com>
14 //
15 
16 #include "MeasureToolPlugin.h"
17 #include "ui_MeasureConfigWidget.h"
18 
19 #include "GeoPainter.h"
20 #include "MarbleDebug.h"
21 #include "MarbleMath.h"
22 #include "MarbleModel.h"
23 #include "MarbleLocale.h"
24 #include "Planet.h"
25 
26 #include <QColor>
27 #include <QPen>
28 #include <QPixmap>
29 #include <QPushButton>
30 #include <QCheckBox>
31 
32 namespace Marble
33 {
34 
35 MeasureToolPlugin::MeasureToolPlugin()
36  : RenderPlugin( 0 ),
37  m_configDialog( 0 ),
38  m_uiConfigWidget( 0 )
39 {
40 }
41 
42 MeasureToolPlugin::MeasureToolPlugin( const MarbleModel *marbleModel )
43  : RenderPlugin( marbleModel ),
44  m_measureLineString( GeoDataLineString( Tessellate ) ),
45  m_mark( ":/mark.png" ),
46 #ifdef Q_OS_MACX
47  m_font_regular( QFont( "Sans Serif", 10, 50, false ) ),
48 #else
49  m_font_regular( QFont( "Sans Serif", 8, 50, false ) ),
50 #endif
51  m_fontascent( QFontMetrics( m_font_regular ).ascent() ),
52  m_pen( Qt::red ),
53  m_marbleWidget( 0 ),
54  m_configDialog( 0 ),
55  m_uiConfigWidget( 0 ),
56  m_showSegmentLabels( true )
57 {
58  m_pen.setWidthF( 2.0 );
59 }
60 
61 QStringList MeasureToolPlugin::backendTypes() const
62 {
63  return QStringList( "measuretool" );
64 }
65 
66 QString MeasureToolPlugin::renderPolicy() const
67 {
68  return QString( "ALWAYS" );
69 }
70 
71 QStringList MeasureToolPlugin::renderPosition() const
72 {
73  return QStringList() << "USER_TOOLS";
74 }
75 
76 QString MeasureToolPlugin::name() const
77 {
78  return tr( "Measure Tool" );
79 }
80 
81 QString MeasureToolPlugin::guiString() const
82 {
83  return tr( "&Measure Tool" );
84 }
85 
86 QString MeasureToolPlugin::nameId() const
87 {
88  return QString( "measure-tool" );
89 }
90 
91 QString MeasureToolPlugin::version() const
92 {
93  return "1.0";
94 }
95 
96 QString MeasureToolPlugin::description() const
97 {
98  return tr( "Measure distances between two or more points." );
99 }
100 
101 QString MeasureToolPlugin::copyrightYears() const
102 {
103  return "2006-2008, 2011";
104 }
105 
106 QList<PluginAuthor> MeasureToolPlugin::pluginAuthors() const
107 {
108  return QList<PluginAuthor>()
109  << PluginAuthor( QString::fromUtf8( "Dennis Nienhüser" ), "earthwings@gentoo.org" )
110  << PluginAuthor( "Torsten Rahn", "tackat@kde.org" )
111  << PluginAuthor( "Inge Wallin", "ingwa@kde.org" )
112  << PluginAuthor( "Carlos Licea", "carlos.licea@kdemail.net" )
113  << PluginAuthor( "Michael Henning", "mikehenning@eclipse.net" )
114  << PluginAuthor( "Valery Kharitonov", "kharvd@gmail.com" )
115  << PluginAuthor( "Mohammed Nafees", "nafees.technocool@gmail.com" );
116 }
117 
118 QIcon MeasureToolPlugin::icon () const
119 {
120  return QIcon(":/icons/measure.png");
121 }
122 
123 void MeasureToolPlugin::initialize ()
124 {
125 }
126 
127 bool MeasureToolPlugin::isInitialized () const
128 {
129  return true;
130 }
131 
132 QDialog *MeasureToolPlugin::configDialog()
133 {
134  if ( !m_configDialog ) {
135  m_configDialog = new QDialog();
136  m_uiConfigWidget = new Ui::MeasureConfigWidget;
137  m_uiConfigWidget->setupUi( m_configDialog );
138  connect( m_uiConfigWidget->m_buttonBox, SIGNAL(accepted()),
139  SLOT(writeSettings()) );
140  QPushButton *applyButton = m_uiConfigWidget->m_buttonBox->button( QDialogButtonBox::Apply );
141  connect( applyButton, SIGNAL(clicked()),
142  this, SLOT(writeSettings()) );
143  }
144 
145  m_uiConfigWidget->m_showSegLabelsCheckBox->setChecked( m_showSegmentLabels );
146 
147  return m_configDialog;
148 }
149 
150 QHash<QString,QVariant> MeasureToolPlugin::settings() const
151 {
152  QHash<QString, QVariant> settings = RenderPlugin::settings();
153 
154  settings.insert( "showSegmentLabels", m_showSegmentLabels );
155 
156  return settings;
157 }
158 
159 void MeasureToolPlugin::setSettings( const QHash<QString,QVariant> &settings )
160 {
161  RenderPlugin::setSettings( settings );
162 
163  m_showSegmentLabels = settings.value( "showSegmentLabels", true ).toBool();
164 }
165 
166 void MeasureToolPlugin::writeSettings()
167 {
168  m_showSegmentLabels = m_uiConfigWidget->m_showSegLabelsCheckBox->isChecked();
169 
170  emit settingsChanged( nameId() );
171  emit repaintNeeded();
172 }
173 
174 bool MeasureToolPlugin::render( GeoPainter *painter,
175  ViewportParams *viewport,
176  const QString& renderPos,
177  GeoSceneLayer * layer )
178 {
179  Q_UNUSED(viewport)
180  Q_UNUSED(renderPos)
181  Q_UNUSED(layer)
182 
183  // No way to paint anything if the list is empty.
184  if ( m_measureLineString.isEmpty() )
185  return true;
186 
187  painter->save();
188 
189  // Prepare for painting the measure line string and paint it.
190  painter->setPen( m_pen );
191 
192  if ( m_showSegmentLabels ) {
193  drawSegments( painter );
194  } else {
195  painter->drawPolyline( m_measureLineString );
196  }
197 
198  // Paint the nodes of the paths.
199  drawMeasurePoints( painter );
200 
201  // Paint the total distance in the upper left corner.
202  qreal totalDistance = m_measureLineString.length( marbleModel()->planet()->radius() );
203 
204  if ( m_measureLineString.size() > 1 )
205  drawTotalDistanceLabel( painter, totalDistance );
206 
207  painter->restore();
208 
209  return true;
210 }
211 
212 void MeasureToolPlugin::drawSegments( GeoPainter* painter )
213 {
214  for ( int segmentIndex = 0; segmentIndex < m_measureLineString.size() - 1; ++segmentIndex ) {
215  GeoDataLineString segment( Tessellate );
216  segment << m_measureLineString[segmentIndex] ;
217  segment << m_measureLineString[segmentIndex + 1];
218 
219  QPen shadowPen( Oxygen::aluminumGray5 );
220  shadowPen.setWidthF(4.0);
221  painter->setPen( shadowPen );
222  painter->drawPolyline( segment );
223 
224  const QLocale::MeasurementSystem measurementSystem = MarbleGlobal::getInstance()->locale()->measurementSystem();
225 
226  const qreal segmentLength = segment.length( marbleModel()->planet()->radius() );
227 
228  QString distanceString;
229 
230  if ( measurementSystem == QLocale::MetricSystem ) {
231  if ( segmentLength >= 1000.0 ) {
232  distanceString = tr("%1 km").arg( segmentLength / 1000.0, 0, 'f', 2 );
233  }
234  else {
235  distanceString = tr("%1 m").arg( segmentLength, 0, 'f', 2 );
236  }
237  }
238  else {
239  distanceString = QString("%1 mi").arg( segmentLength / 1000.0 * KM2MI, 0, 'f', 2 );
240  }
241 
242  QPen linePen;
243 
244  // have three alternating colors for the segments
245  switch ( segmentIndex % 3 ) {
246  case 0:
247  linePen.setColor( Oxygen::brickRed4 );
248  break;
249  case 1:
250  linePen.setColor( Oxygen::forestGreen4 );
251  break;
252  case 2:
253  linePen.setColor( Oxygen::skyBlue4 );
254  break;
255  }
256 
257  linePen.setWidthF(2.0);
258  painter->setPen( linePen );
259  painter->drawPolyline( segment, distanceString, LineCenter );
260  }
261 }
262 
263 void MeasureToolPlugin::drawMeasurePoints( GeoPainter *painter )
264 {
265  // Paint the marks.
266  GeoDataLineString::const_iterator itpoint = m_measureLineString.constBegin();
267  GeoDataLineString::const_iterator const endpoint = m_measureLineString.constEnd();
268  for (; itpoint != endpoint; ++itpoint )
269  {
270  painter->drawPixmap( *itpoint, m_mark );
271  }
272 }
273 
274 void MeasureToolPlugin::drawTotalDistanceLabel( GeoPainter *painter,
275  qreal totalDistance )
276 {
277  QString distanceString;
278 
279  QLocale::MeasurementSystem measurementSystem;
280  measurementSystem = MarbleGlobal::getInstance()->locale()->measurementSystem();
281 
282  if ( measurementSystem == QLocale::MetricSystem ) {
283  if ( totalDistance >= 1000.0 ) {
284  distanceString = tr("Total Distance: %1 km").arg( totalDistance/1000.0 );
285  }
286  else {
287  distanceString = tr("Total Distance: %1 m").arg( totalDistance );
288  }
289  }
290  else {
291  distanceString = QString("Total Distance: %1 mi").arg( totalDistance/1000.0 * KM2MI );
292  }
293 
294  painter->setPen( QColor( Qt::black ) );
295  painter->setBrush( QColor( 192, 192, 192, 192 ) );
296 
297  painter->drawRect( 10, 105, 10 + QFontMetrics( m_font_regular ).boundingRect( distanceString ).width() + 5, 10 + m_fontascent + 2 );
298  painter->setFont( m_font_regular );
299  painter->drawText( 15, 110 + m_fontascent, distanceString );
300 }
301 
302 
303 void MeasureToolPlugin::addMeasurePoint( qreal lon, qreal lat )
304 {
305  m_measureLineString << GeoDataCoordinates( lon, lat );
306 
307  emit numberOfMeasurePointsChanged( m_measureLineString.size() );
308 }
309 
310 void MeasureToolPlugin::removeLastMeasurePoint()
311 {
312  if (!m_measureLineString.isEmpty())
313  m_measureLineString.remove( m_measureLineString.size() - 1 );
314 
315  emit numberOfMeasurePointsChanged( m_measureLineString.size() );
316 }
317 
318 void MeasureToolPlugin::removeMeasurePoints()
319 {
320  m_measureLineString.clear();
321 
322  emit numberOfMeasurePointsChanged( m_measureLineString.size() );
323 }
324 
325 void MeasureToolPlugin::addContextItems()
326 {
327  MarbleWidgetPopupMenu *menu = m_marbleWidget->popupMenu();
328 
329  // Connect the inputHandler and the measure tool to the popup menu
330  m_addMeasurePointAction = new QAction( QIcon(":/icons/measure.png"), tr( "Add &Measure Point" ), this );
331  m_removeLastMeasurePointAction = new QAction( tr( "Remove &Last Measure Point" ), this );
332  m_removeLastMeasurePointAction->setEnabled( false );
333  m_removeMeasurePointsAction = new QAction( tr( "&Remove Measure Points" ), this );
334  m_removeMeasurePointsAction->setEnabled( false );
335  m_separator = new QAction( this );
336  m_separator->setSeparator( true );
337 
338  if ( ! MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen ) {
339  menu->addAction( Qt::RightButton, m_addMeasurePointAction );
340  menu->addAction( Qt::RightButton, m_removeLastMeasurePointAction );
341  menu->addAction( Qt::RightButton, m_removeMeasurePointsAction );
342  menu->addAction( Qt::RightButton, m_separator );
343  }
344 
345  connect( m_addMeasurePointAction, SIGNAL(triggered()), SLOT(addMeasurePointEvent()) );
346  connect( m_removeLastMeasurePointAction, SIGNAL(triggered()), SLOT(removeLastMeasurePoint()) );
347  connect( m_removeMeasurePointsAction, SIGNAL(triggered()), SLOT(removeMeasurePoints()) );
348 
349  connect( this, SIGNAL(numberOfMeasurePointsChanged(int)), SLOT(setNumberOfMeasurePoints(int)) );
350 }
351 
352 void MeasureToolPlugin::removeContextItems()
353 {
354  delete m_addMeasurePointAction;
355  delete m_removeLastMeasurePointAction;
356  delete m_removeMeasurePointsAction;
357  delete m_separator;
358 }
359 
360 void MeasureToolPlugin::addMeasurePointEvent()
361 {
362  QPoint p = m_marbleWidget->popupMenu()->mousePosition();
363 
364  qreal lat;
365  qreal lon;
366  m_marbleWidget->geoCoordinates( p.x(), p.y(), lon, lat, GeoDataCoordinates::Radian );
367 
368  addMeasurePoint( lon, lat );
369 }
370 
371 void MeasureToolPlugin::setNumberOfMeasurePoints( int newNumber )
372 {
373  const bool enableMeasureActions = ( newNumber > 0 );
374  m_removeMeasurePointsAction->setEnabled(enableMeasureActions);
375  m_removeLastMeasurePointAction->setEnabled(enableMeasureActions);
376 }
377 
378 bool MeasureToolPlugin::eventFilter( QObject *object, QEvent *e )
379 {
380  if ( m_marbleWidget && !enabled() ) {
381  m_marbleWidget = 0;
382  removeContextItems();
383  m_measureLineString.clear();
384  }
385 
386  if ( m_marbleWidget || !enabled() || !visible() ) {
387  return RenderPlugin::eventFilter( object, e );
388  }
389 
390  MarbleWidget *widget = qobject_cast<MarbleWidget*>( object );
391 
392  if ( widget ) {
393  m_marbleWidget = widget;
394  addContextItems();
395  }
396 
397  return RenderPlugin::eventFilter( object, e );
398 }
399 
400 }
401 
402 Q_EXPORT_PLUGIN2( MeasureToolPlugin, Marble::MeasureToolPlugin )
403 
404 #include "MeasureToolPlugin.moc"
405 
Marble::RenderPlugin::visible
bool visible() const
is visible
Marble::GeoDataLineString::length
virtual qreal length(qreal planetRadius, int offset=0) const
Returns the length of LineString across a sphere starting from a coordinate in LineString This method...
Definition: GeoDataLineString.cpp:559
Marble::GeoDataCoordinates::Radian
Definition: GeoDataCoordinates.h:65
Marble::MarbleLocale::measurementSystem
QLocale::MeasurementSystem measurementSystem() const
Definition: MarbleLocale.cpp:45
MarbleMath.h
Marble::RenderPlugin::repaintNeeded
void repaintNeeded(QRegion dirtyRegion=QRegion())
This signal is emitted if an update of the view is needed.
Marble::MeasureToolPlugin::eventFilter
bool eventFilter(QObject *object, QEvent *event)
Definition: MeasureToolPlugin.cpp:378
QDialog
Marble::MeasureToolPlugin::settings
QHash< QString, QVariant > settings() const
Settings of the plugin.
Definition: MeasureToolPlugin.cpp:150
Marble::GeoPainter
A painter that allows to draw geometric primitives on the map.
Definition: GeoPainter.h:98
Marble::RenderPlugin::eventFilter
bool eventFilter(QObject *, QEvent *)
Definition: RenderPlugin.cpp:209
MarbleModel.h
This file contains the headers for MarbleModel.
Marble::GeoDataLineString::size
int size() const
Returns the number of nodes in a LineString.
Definition: GeoDataLineString.cpp:134
Marble::MeasureToolPlugin::isInitialized
bool isInitialized() const
Definition: MeasureToolPlugin.cpp:127
Marble::PluginAuthor
Definition: PluginInterface.h:28
Marble::MeasureToolPlugin::backendTypes
QStringList backendTypes() const
Returns the name(s) of the backend that the plugin can render This method should return the name of t...
Definition: MeasureToolPlugin.cpp:61
Marble::MeasureToolPlugin::MeasureToolPlugin
MeasureToolPlugin()
Definition: MeasureToolPlugin.cpp:35
Marble::GeoPainter::drawPolyline
void drawPolyline(const GeoDataLineString &lineString, const QString &labelText=QString(), LabelPositionFlags labelPositionFlags=LineCenter)
Draws a given line string (a "polyline").
Definition: GeoPainter.cpp:474
Planet.h
QObject
MarbleDebug.h
Marble::MeasureToolPlugin::copyrightYears
QString copyrightYears() const
Definition: MeasureToolPlugin.cpp:101
Marble::MarbleWidget
A widget class that displays a view of the earth.
Definition: MarbleWidget.h:102
Marble::MeasureToolPlugin::nameId
QString nameId() const
Returns the unique name of the plugin.
Definition: MeasureToolPlugin.cpp:86
Marble::MeasureToolPlugin::numberOfMeasurePointsChanged
void numberOfMeasurePointsChanged(int newNumber)
Marble::MeasureToolPlugin::version
QString version() const
Definition: MeasureToolPlugin.cpp:91
Marble::MeasureToolPlugin::pluginAuthors
QList< PluginAuthor > pluginAuthors() const
Definition: MeasureToolPlugin.cpp:106
Marble::GeoSceneLayer
Layer of a GeoScene document.
Definition: GeoSceneLayer.h:43
Marble::RenderPlugin::settingsChanged
void settingsChanged(QString nameId)
This signal is emitted if the settings of the RenderPlugin changed.
Marble::MeasureToolPlugin::renderPosition
QStringList renderPosition() const
Preferred level in the layer stack for the rendering.
Definition: MeasureToolPlugin.cpp:71
Marble::MeasureToolPlugin::initialize
void initialize()
Definition: MeasureToolPlugin.cpp:123
Marble::LineCenter
Definition: MarbleGlobal.h:111
Marble::Oxygen::skyBlue4
QColor const skyBlue4
Definition: MarbleColors.h:56
Marble::MarbleGlobal::locale
MarbleLocale * locale() const
Definition: MarbleGlobal.cpp:43
MarbleLocale.h
GeoPainter.h
Marble::GeoDataLineString
A LineString that allows to store a contiguous set of line segments.
Definition: GeoDataLineString.h:75
Marble::MeasureToolPlugin
Definition: MeasureToolPlugin.h:38
Marble::ViewportParams
A public class that controls what is visible in the viewport of a Marble map.
Definition: ViewportParams.h:44
Q_EXPORT_PLUGIN2
#define Q_EXPORT_PLUGIN2(a, b)
Definition: marble_export.h:34
Marble::MeasureToolPlugin::description
QString description() const
Returns a user description of the plugin.
Definition: MeasureToolPlugin.cpp:96
Marble::KM2MI
const qreal KM2MI
Definition: MarbleGlobal.h:189
Marble::MarbleGlobal::SmallScreen
Definition: MarbleGlobal.h:268
Marble::MarbleGlobal::getInstance
static MarbleGlobal * getInstance()
Definition: MarbleGlobal.cpp:37
Marble::Oxygen::brickRed4
QColor const brickRed4
Definition: MarbleColors.h:32
Marble::MarbleModel
The data model (not based on QAbstractModel) for a MarbleWidget.
Definition: MarbleModel.h:96
Marble::GeoDataLineString::isEmpty
bool isEmpty() const
Returns whether the LineString has no nodes at all.
Definition: GeoDataLineString.cpp:129
MeasureToolPlugin.h
Marble::Oxygen::aluminumGray5
QColor const aluminumGray5
Definition: MarbleColors.h:91
Marble::MeasureToolPlugin::render
bool render(GeoPainter *painter, ViewportParams *viewport, const QString &renderPos, GeoSceneLayer *layer=0)
Renders the content provided by the layer on the viewport.
Definition: MeasureToolPlugin.cpp:174
Marble::MarbleWidget::geoCoordinates
bool geoCoordinates(int x, int y, qreal &lon, qreal &lat, GeoDataCoordinates::Unit=GeoDataCoordinates::Degree) const
Get the earth coordinates corresponding to a pixel in the widget.
Definition: MarbleWidget.cpp:764
Marble::MeasureToolPlugin::name
QString name() const
Returns the user-visible name of the plugin.
Definition: MeasureToolPlugin.cpp:76
Marble::MeasureToolPlugin::renderPolicy
QString renderPolicy() const
Return how the plugin settings should be used.
Definition: MeasureToolPlugin.cpp:66
Marble::Oxygen::forestGreen4
QColor const forestGreen4
Definition: MarbleColors.h:74
Marble::MarbleWidget::popupMenu
MarbleWidgetPopupMenu * popupMenu()
Definition: MarbleWidget.cpp:299
Marble::MeasureToolPlugin::guiString
QString guiString() const
String that should be displayed in GUI.
Definition: MeasureToolPlugin.cpp:81
Marble::RenderPlugin::enabled
bool enabled() const
is enabled
Marble::Tessellate
Definition: MarbleGlobal.h:32
Marble::MarbleWidgetPopupMenu::mousePosition
QPoint mousePosition() const
mousePosition Position of the last mouse button click
Definition: MarbleWidgetPopupMenu.cpp:689
Marble::RenderPlugin::marbleModel
const MarbleModel * marbleModel() const
Access to the MarbleModel.
Definition: RenderPlugin.cpp:81
Marble::RenderPlugin::settings
virtual QHash< QString, QVariant > settings() const
Settings of the plugin.
Definition: RenderPlugin.cpp:183
Marble::MeasureToolPlugin::configDialog
QDialog * configDialog()
Returns a pointer to the configuration dialog of the plugin.
Definition: MeasureToolPlugin.cpp:132
Marble::MeasureToolPlugin::icon
QIcon icon() const
Returns an icon for the plugin.
Definition: MeasureToolPlugin.cpp:118
Marble::MeasureToolPlugin::setSettings
void setSettings(const QHash< QString, QVariant > &settings)
Set the settings of the plugin.
Definition: MeasureToolPlugin.cpp:159
Marble::RenderPlugin
The abstract class that creates a renderable item.
Definition: RenderPlugin.h:43
Marble::RenderPlugin::setSettings
virtual void setSettings(const QHash< QString, QVariant > &settings)
Set the settings of the plugin.
Definition: RenderPlugin.cpp:193
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:38:51 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal