• 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
  • lib
  • marble
MarbleWidgetPopupMenu.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 Inge Wallin <ingwa@kde.org>
10 // Copyright 2012 Illya Kovalevskyy <illya.kovalevskyy@gmail.com>
11 //
12 
13 // Self
14 #include "MarbleWidgetPopupMenu.h"
15 
16 // Marble
17 #include "AbstractDataPluginItem.h"
18 #include "AbstractFloatItem.h"
19 #include "MarbleAboutDialog.h"
20 #include "MarbleWidget.h"
21 #include "MarbleModel.h"
22 #include "GeoDataPlacemark.h"
23 #include "GeoDataStyle.h"
24 #include "GeoDataExtendedData.h"
25 #include "GeoSceneDocument.h"
26 #include "GeoSceneHead.h"
27 #include "MarbleClock.h"
28 #include "MarbleDebug.h"
29 #include "PopupLayer.h"
30 #include "Planet.h"
31 #include "routing/RoutingManager.h"
32 #include "routing/RouteRequest.h"
33 #include "EditBookmarkDialog.h"
34 #include "BookmarkManager.h"
35 #include "MarbleDirs.h"
36 #include "ReverseGeocodingRunnerManager.h"
37 #include "TemplateDocument.h"
38 
39 // Qt
40 #include <QApplication>
41 #include <QMimeData>
42 #include <QPointer>
43 #include <QAction>
44 #include <QClipboard>
45 #include <QMenu>
46 #include <QMessageBox>
47 
48 namespace Marble {
49 /* TRANSLATOR Marble::MarbleWidgetPopupMenu */
50 
51 class MarbleWidgetPopupMenu::Private {
52 public:
53  const MarbleModel *const m_model;
54  MarbleWidget *m_widget;
55 
56  QVector<const GeoDataPlacemark*> m_featurelist;
57  QList<AbstractDataPluginItem *> m_itemList;
58 
59  QMenu *const m_lmbMenu;
60  QMenu *const m_rmbMenu;
61 
62  QAction *m_infoDialogAction;
63  QAction *m_showOrbitAction;
64  QAction *m_trackPlacemarkAction;
65  QAction *m_directionsToHereAction;
66 
67  QAction *const m_copyCoordinateAction;
68 
69  QAction *m_rmbExtensionPoint;
70 
71  ReverseGeocodingRunnerManager *const m_runnerManager;
72 
73  QPoint m_mousePosition;
74 
75 public:
76  Private( MarbleWidget *widget, const MarbleModel *model, MarbleWidgetPopupMenu* parent );
77  QMenu* createInfoBoxMenu();
78  QString filterEmptyShortDescription(const QString &description) const;
79  void setupDialogSatellite(PopupLayer *popup, const GeoDataPlacemark *index);
80  void setupDialogCity(PopupLayer *popup, const GeoDataPlacemark *index);
81  void setupDialogNation(PopupLayer *popup, const GeoDataPlacemark *index);
82  void setupDialogGeoPlaces(PopupLayer *popup, const GeoDataPlacemark *index);
83  void setupDialogSkyPlaces(PopupLayer *popup, const GeoDataPlacemark *index);
84 
90  bool mouseCoordinates( GeoDataCoordinates* coordinates, QAction* dataContainer );
91 };
92 
93 MarbleWidgetPopupMenu::Private::Private( MarbleWidget *widget, const MarbleModel *model, MarbleWidgetPopupMenu* parent ) :
94  m_model(model),
95  m_widget(widget),
96  m_lmbMenu( new QMenu( m_widget ) ),
97  m_rmbMenu( new QMenu( m_widget ) ),
98  m_directionsToHereAction( 0 ),
99  m_copyCoordinateAction( new QAction( QIcon(":/icons/copy-coordinates.png"), tr("Copy Coordinates"), parent ) ),
100  m_rmbExtensionPoint( 0 ),
101  m_runnerManager( new ReverseGeocodingRunnerManager( model, parent ) )
102 {
103  // Property actions (Left mouse button)
104  m_infoDialogAction = new QAction( parent );
105  m_infoDialogAction->setData( 0 );
106 
107  m_showOrbitAction = new QAction( tr( "Display orbit" ), parent );
108  m_showOrbitAction->setCheckable( true );
109  m_showOrbitAction->setData( 0 );
110 
111  m_trackPlacemarkAction = new QAction( tr( "Keep centered" ), parent );
112  m_trackPlacemarkAction->setData( 0 );
113 
114  // Tool actions (Right mouse button)
115  QAction* fromHere = new QAction( tr( "Directions &from here" ), parent );
116  m_directionsToHereAction = new QAction( tr( "Directions &to here" ), parent );
117  RouteRequest* request = m_widget->model()->routingManager()->routeRequest();
118  if ( request ) {
119  fromHere->setIcon( QIcon( request->pixmap( 0, 16 ) ) );
120  int const lastIndex = qMax( 1, request->size()-1 );
121  m_directionsToHereAction->setIcon( QIcon( request->pixmap( lastIndex, 16 ) ) );
122  }
123  QAction* addBookmark = new QAction( QIcon(":/icons/bookmark-new.png"),
124  tr( "Add &Bookmark" ), parent );
125  QAction* fullscreenAction = new QAction( tr( "&Full Screen Mode" ), parent );
126  fullscreenAction->setCheckable( true );
127 
128  QAction* aboutDialogAction = new QAction( QIcon(":/icons/marble.png"), tr( "&About" ), parent );
129 
130  QMenu* infoBoxMenu = createInfoBoxMenu();
131 
132  const bool smallScreen = MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen;
133 
134  if ( !smallScreen ) {
135  m_rmbExtensionPoint = m_rmbMenu->addSeparator();
136  }
137 
138  m_rmbMenu->addAction( fromHere );
139  m_rmbMenu->addAction( m_directionsToHereAction );
140  m_rmbMenu->addSeparator();
141  m_rmbMenu->addAction( addBookmark );
142  if ( !smallScreen ) {
143  m_rmbMenu->addAction( m_copyCoordinateAction );
144  }
145  m_rmbMenu->addAction( QIcon(":/icons/addressbook-details.png"), tr( "&Address Details" ), parent, SLOT(startReverseGeocoding()) );
146  m_rmbMenu->addSeparator();
147  m_rmbMenu->addMenu( infoBoxMenu );
148 
149  if ( !smallScreen ) {
150  m_rmbMenu->addAction( aboutDialogAction );
151  } else {
152  m_rmbMenu->addAction( fullscreenAction );
153  }
154 
155  parent->connect( fromHere, SIGNAL(triggered()), SLOT(directionsFromHere()) );
156  parent->connect( m_directionsToHereAction, SIGNAL(triggered()), SLOT(directionsToHere()) );
157  parent->connect( addBookmark, SIGNAL(triggered()), SLOT(addBookmark()) );
158  parent->connect( aboutDialogAction, SIGNAL(triggered()), SLOT(slotAboutDialog()) );
159  parent->connect( m_copyCoordinateAction, SIGNAL(triggered()), SLOT(slotCopyCoordinates()) );
160  parent->connect( m_infoDialogAction, SIGNAL(triggered()), SLOT(slotInfoDialog()) );
161  parent->connect( m_showOrbitAction, SIGNAL(triggered(bool)), SLOT(slotShowOrbit(bool)) );
162  parent->connect( m_trackPlacemarkAction, SIGNAL(triggered(bool)), SLOT(slotTrackPlacemark()) );
163  parent->connect( fullscreenAction, SIGNAL(triggered(bool)), parent, SLOT(toggleFullscreen(bool)) );
164 
165  parent->connect( m_runnerManager, SIGNAL(reverseGeocodingFinished(GeoDataCoordinates,GeoDataPlacemark)),
166  parent, SLOT(showAddressInformation(GeoDataCoordinates,GeoDataPlacemark)) );
167 }
168 
169 MarbleWidgetPopupMenu::MarbleWidgetPopupMenu(MarbleWidget *widget,
170  const MarbleModel *model)
171  : QObject(widget),
172  d( new Private( widget, model, this ) )
173 {
174  // nothing to do
175 }
176 
177 MarbleWidgetPopupMenu::~MarbleWidgetPopupMenu()
178 {
179  delete d;
180 }
181 
182 QMenu* MarbleWidgetPopupMenu::Private::createInfoBoxMenu()
183 {
184  QMenu* menu = new QMenu( tr( "&Info Boxes" ) );
185  QList<AbstractFloatItem *> floatItemList = m_widget->floatItems();
186 
187  QList<AbstractFloatItem *>::const_iterator iter = floatItemList.constBegin();
188  QList<AbstractFloatItem *>::const_iterator const end = floatItemList.constEnd();
189  for (; iter != end; ++iter )
190  {
191  menu->addAction( (*iter)->action() );
192  }
193  return menu;
194 }
195 
196 void MarbleWidgetPopupMenu::showLmbMenu( int xpos, int ypos )
197 {
198  bool const smallScreen = MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen;
199  if ( smallScreen ) {
200  showRmbMenu( xpos, ypos );
201  return;
202  }
203 
204  if (!d->m_lmbMenu->isEmpty()) {
205  d->m_lmbMenu->clear();
206  // just clear()-ing the menu won't delete the submenus
207  foreach( QObject *child, d->m_lmbMenu->children() ) {
208  child->deleteLater();
209  }
210  }
211 
212  d->m_mousePosition.setX(xpos);
213  d->m_mousePosition.setY(ypos);
214 
215  const QPoint curpos = QPoint( xpos, ypos );
216  d->m_featurelist = d->m_widget->whichFeatureAt( curpos );
217 
218  int actionidx = 1;
219  bool hasSatellites = false;
220 
221  QVector<const GeoDataPlacemark*>::const_iterator it = d->m_featurelist.constBegin();
222  QVector<const GeoDataPlacemark*>::const_iterator const itEnd = d->m_featurelist.constEnd();
223  for (; it != itEnd; ++it )
224  {
225  QString name = (*it)->name();
226  QPixmap icon = QPixmap::fromImage( ( *it)->style()->iconStyle().icon() );
227  d->m_infoDialogAction->setData( actionidx );
228 
229  //TODO: don't hardcode this check ?
230  if ( (*it)->visualCategory() != GeoDataFeature::Satellite ) {
231  d->m_infoDialogAction->setText( name );
232  d->m_infoDialogAction->setIcon( icon );
233 
234  d->m_lmbMenu->addAction( d->m_infoDialogAction );
235  } else {
236  hasSatellites = true;
237  QMenu *subMenu = new QMenu( name, d->m_lmbMenu );
238  subMenu->setIcon( icon );
239  d->m_infoDialogAction->setText( tr( "Satellite information" ) );
240  d->m_infoDialogAction->setIcon( QIcon() );
241  subMenu->addAction( d->m_infoDialogAction );
242 
243  d->m_showOrbitAction->setChecked( (*it)->style()->lineStyle().penStyle() != Qt::NoPen );
244  d->m_showOrbitAction->setData( actionidx );
245  subMenu->addAction( d->m_showOrbitAction );
246 
247  d->m_trackPlacemarkAction->setData( actionidx );
248  subMenu->addAction( d->m_trackPlacemarkAction );
249 
250  d->m_lmbMenu->addAction( subMenu->menuAction() );
251  }
252  actionidx++;
253  }
254 
255  d->m_itemList = d->m_widget->whichItemAt( curpos );
256  QList<AbstractDataPluginItem *>::const_iterator itW = d->m_itemList.constBegin();
257  QList<AbstractDataPluginItem *>::const_iterator const itWEnd = d->m_itemList.constEnd();
258  for (; itW != itWEnd; ++itW )
259  {
260  foreach ( QAction* action, (*itW)->actions() ) {
261  d->m_lmbMenu->addAction( action );
262  }
263  }
264 
265  switch ( d->m_lmbMenu->actions().size() ) {
266  case 0: break; // nothing to do, ignore
267  case 1: if ( ! hasSatellites ) {
268  d->m_lmbMenu->actions().first()->activate( QAction::Trigger );
269  break; // one action? perform immediately
270  }
271  default: d->m_lmbMenu->popup( d->m_widget->mapToGlobal( curpos ) );
272  }
273 }
274 
275 
276 void MarbleWidgetPopupMenu::showRmbMenu( int xpos, int ypos )
277 {
278  qreal lon, lat;
279  const bool visible = d->m_widget->geoCoordinates( xpos, ypos, lon, lat, GeoDataCoordinates::Radian );
280  if ( !visible )
281  return;
282 
283  d->m_mousePosition.setX(xpos);
284  d->m_mousePosition.setY(ypos);
285 
286  QPoint curpos = QPoint( xpos, ypos );
287  d->m_copyCoordinateAction->setData( curpos );
288  RouteRequest* request = d->m_widget->model()->routingManager()->routeRequest();
289  if ( request ) {
290  int const lastIndex = qMax( 1, request->size()-1 );
291  d->m_directionsToHereAction->setIcon( QIcon( request->pixmap( lastIndex, 16 ) ) );
292  }
293 
294  d->m_rmbMenu->popup( d->m_widget->mapToGlobal( curpos ) );
295 }
296 
297 void MarbleWidgetPopupMenu::slotInfoDialog()
298 {
299  QAction *action = qobject_cast<QAction *>( sender() );
300  if ( action == 0 ) {
301  mDebug() << "Warning: slotInfoDialog should be called by a QAction signal";
302  return;
303  }
304 
305  int actionidx = action->data().toInt();
306 
307  if ( actionidx > 0 ) {
308  const GeoDataPlacemark *index = d->m_featurelist.at( actionidx -1 );
309  bool isSatellite = (index->visualCategory() == GeoDataFeature::Satellite);
310  bool isCity (index->visualCategory() >= GeoDataFeature::SmallCity &&
311  index->visualCategory() <= GeoDataFeature::LargeNationCapital);
312  bool isNation = (index->visualCategory() == GeoDataFeature::Nation);
313  bool isSky = false;
314  if ( d->m_model->mapTheme() ) {
315  isSky = d->m_model->mapTheme()->head()->target() == "sky";
316  }
317  PopupLayer* popup = d->m_widget->popupLayer();
318  popup->setSize(QSizeF(580, 620));
319  if (index->role().isEmpty() || isSatellite || isCity || isNation || isSky) {
320  if (isSatellite) {
321  d->setupDialogSatellite(popup, index);
322  } else if (isCity) {
323  d->setupDialogCity(popup, index);
324  } else if (isNation) {
325  d->setupDialogNation(popup, index);
326  } else if (isSky) {
327  d->setupDialogSkyPlaces(popup, index);
328  } else {
329  popup->setContent(index->description());
330  }
331  } else {
332  d->setupDialogGeoPlaces(popup, index);
333  }
334  popup->popup();
335  }
336 }
337 
338 QString MarbleWidgetPopupMenu::Private::filterEmptyShortDescription(const QString &description) const
339 {
340  if(description.isEmpty())
341  return tr("No description available.");
342  return description;
343 }
344 
345 void MarbleWidgetPopupMenu::Private::setupDialogSatellite(PopupLayer *popup, const GeoDataPlacemark *index)
346 {
347  GeoDataCoordinates location = index->coordinate(m_model->clockDateTime());
348  popup->setCoordinates(location, Qt::AlignRight | Qt::AlignVCenter);
349 
350  const QString description = index->description();
351  TemplateDocument doc(description);
352  doc["altitude"] = QString::number(location.altitude(), 'f', 2);
353  doc["latitude"] = location.latToString();
354  doc["longitude"] = location.lonToString();
355  popup->setContent(doc.finalText());
356 }
357 
358 void MarbleWidgetPopupMenu::Private::setupDialogCity(PopupLayer *popup, const GeoDataPlacemark *index)
359 {
360  GeoDataCoordinates location = index->coordinate(m_model->clockDateTime());
361  popup->setCoordinates(location, Qt::AlignRight | Qt::AlignVCenter);
362 
363  QFile descriptionFile(":/marble/webpopup/city.html");
364  if (!descriptionFile.open(QIODevice::ReadOnly)) {
365  return;
366  }
367 
368  const QString description = descriptionFile.readAll();
369  TemplateDocument doc(description);
370 
371  doc["name"] = index->name();
372  QString roleString;
373  const QString role = index->role();
374  if(role=="PPLC") {
375  roleString = tr("National Capital");
376  } else if(role=="PPL") {
377  roleString = tr("City");
378  } else if(role=="PPLA") {
379  roleString = tr("State Capital");
380  } else if(role=="PPLA2") {
381  roleString = tr("County Capital");
382  } else if(role=="PPLA3" || role=="PPLA4" ) {
383  roleString = tr("Capital");
384  } else if(role=="PPLF" || role=="PPLG" || role=="PPLL" || role=="PPLQ" ||
385  role=="PPLR" || role=="PPLS" || role=="PPLW" ) {
386  roleString = tr("Village");
387  }
388 
389  doc["category"] = roleString;
390  doc["shortDescription"] = filterEmptyShortDescription(index->description());
391  doc["latitude"] = location.latToString();
392  doc["longitude"] = location.lonToString();
393  doc["elevation"] = QString::number(location.altitude(), 'f', 2);
394  doc["population"] = QString::number(index->population());
395  doc["country"] = index->countryCode();
396  doc["state"] = index->state();
397 
398  QString dst = QString( "%1" ).arg( ( index->extendedData().value("gmt").value().toInt() +
399  index->extendedData().value("dst").value().toInt() ) /
400  ( double ) 100, 0, 'f', 1 );
401  // There is an issue about UTC.
402  // It's possible to variants (e.g.):
403  // +1.0 and -1.0, but dst does not have + an the start
404  if(dst.startsWith('-')) {
405  doc["timezone"] = dst;
406  } else {
407  doc["timezone"] = "+"+dst;
408  }
409 
410  const QString flagPath = MarbleDirs::path(
411  QString("flags/flag_%1.svg").arg(index->countryCode().toLower()));
412  doc["flag"] = flagPath;
413 
414  popup->setContent(doc.finalText());
415 }
416 
417 void MarbleWidgetPopupMenu::Private::setupDialogNation(PopupLayer *popup, const GeoDataPlacemark *index)
418 {
419  GeoDataCoordinates location = index->coordinate(m_model->clockDateTime());
420  popup->setCoordinates(location, Qt::AlignRight | Qt::AlignVCenter);
421 
422  QFile descriptionFile(":/marble/webpopup/nation.html");
423  if (!descriptionFile.open(QIODevice::ReadOnly)) {
424  return;
425  }
426 
427  const QString description = descriptionFile.readAll();
428  TemplateDocument doc(description);
429 
430  doc["name"] = index->name();
431  doc["shortDescription"] = filterEmptyShortDescription(index->description());
432  doc["latitude"] = location.latToString();
433  doc["longitude"] = location.lonToString();
434  doc["elevation"] = QString::number(location.altitude(), 'f', 2);
435  doc["population"] = QString::number(index->population());
436  doc["area"] = QString::number(index->area(), 'f', 2);
437 
438  const QString flagPath = MarbleDirs::path(QString("flags/flag_%1.svg").arg(index->countryCode().toLower()) );
439  doc["flag"] = flagPath;
440 
441  popup->setContent(doc.finalText());
442 }
443 
444 void MarbleWidgetPopupMenu::Private::setupDialogGeoPlaces(PopupLayer *popup, const GeoDataPlacemark *index)
445 {
446  GeoDataCoordinates location = index->coordinate(m_model->clockDateTime());
447  popup->setCoordinates(location, Qt::AlignRight | Qt::AlignVCenter);
448 
449  QFile descriptionFile(":/marble/webpopup/geoplace.html");
450  if (!descriptionFile.open(QIODevice::ReadOnly)) {
451  return;
452  }
453 
454  const QString description = descriptionFile.readAll();
455  TemplateDocument doc(description);
456 
457  doc["name"] = index->name();
458  doc["latitude"] = location.latToString();
459  doc["longitude"] = location.lonToString();
460  doc["elevation"] = QString::number(location.altitude(), 'f', 2);
461  doc["shortDescription"] = filterEmptyShortDescription(index->description());
462 
463  popup->setContent(doc.finalText());
464 }
465 
466 void MarbleWidgetPopupMenu::Private::setupDialogSkyPlaces(PopupLayer *popup, const GeoDataPlacemark *index)
467 {
468  GeoDataCoordinates location = index->coordinate(m_model->clockDateTime());
469  popup->setCoordinates(location, Qt::AlignRight | Qt::AlignVCenter);
470 
471  QFile descriptionFile(":/marble/webpopup/skyplace.html");
472  if (!descriptionFile.open(QIODevice::ReadOnly)) {
473  return;
474  }
475 
476  const QString description = descriptionFile.readAll();
477  TemplateDocument doc(description);
478 
479  doc["name"] = index->name();
480  doc["latitude"] = GeoDataCoordinates::latToString(
481  location.latitude(), GeoDataCoordinates::Astro, GeoDataCoordinates::Radian, -1, 'f');
482  doc["longitude"] = GeoDataCoordinates::lonToString(
483  location.longitude(), GeoDataCoordinates::Astro, GeoDataCoordinates::Radian, -1, 'f');
484  doc["shortDescription"] = filterEmptyShortDescription(index->description());
485 
486  popup->setContent(doc.finalText());
487 }
488 
489 void MarbleWidgetPopupMenu::slotShowOrbit( bool show )
490 {
491  QAction *action = qobject_cast<QAction *>( sender() );
492  if ( action == 0 ) {
493  mDebug() << "Warning: slotShowOrbit should be called by a QAction signal";
494  return;
495  }
496 
497  int actionidx = action->data().toInt();
498 
499  if ( actionidx > 0 ) {
500  const GeoDataPlacemark *index = d->m_featurelist.at( actionidx -1 );
501 
502  Qt::PenStyle penStyle = show ? Qt::SolidLine : Qt::NoPen;
503  index->style()->lineStyle().setPenStyle( penStyle );
504  }
505 }
506 
507 void MarbleWidgetPopupMenu::slotTrackPlacemark()
508 {
509  QAction *action = qobject_cast<QAction *>( sender() );
510  if ( action == 0 ) {
511  mDebug() << "Warning: slotTrackPlacemark should be called by a QAction signal";
512  return;
513  }
514 
515  int actionidx = action->data().toInt();
516 
517  if ( actionidx > 0 ) {
518  mDebug() << actionidx;
519  const GeoDataPlacemark *index = d->m_featurelist.at( actionidx -1 );
520  emit trackPlacemark( index );
521  }
522 }
523 
524 void MarbleWidgetPopupMenu::slotCopyCoordinates()
525 {
526  GeoDataCoordinates coordinates;
527  if ( d->mouseCoordinates( &coordinates, d->m_copyCoordinateAction ) ) {
528  const qreal longitude_degrees = coordinates.longitude(GeoDataCoordinates::Degree);
529  const qreal latitude_degrees = coordinates.latitude(GeoDataCoordinates::Degree);
530 
531  // importing this representation into Marble does not show anything,
532  // but Merkaartor shows the point
533  const QString kmlRepresentation = QString::fromLatin1(
534  "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
535  "<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n"
536  "<Document>\n"
537  " <Placemark>\n"
538 // " <name></name>\n"
539  " <Point>\n"
540  " <coordinates>%1,%2</coordinates>\n"
541  " </Point>\n"
542  " </Placemark>\n"
543  "</Document>\n"
544  "</kml>\n"
545  ).arg(longitude_degrees, 0, 'f', 10).arg(latitude_degrees, 0, 'f', 10);
546 
547  // importing this data into Marble and Merkaartor works
548  const QString gpxRepresentation = QString::fromLatin1(
549  "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>\n"
550  "<gpx xmlns=\"http://www.topografix.com/GPX/1/1\" creator=\"trippy\" version=\"0.1\"\n"
551  " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
552  " xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\">\n"
553  " <wpt lat=\"%1\" lon=\"%2\">\n"
554 // " <ele>%3</ele>\n"
555 // " <time></time>\n"
556 // " <name>%4</name>\n"
557  " </wpt>\n"
558  "</gpx>\n"
559  ).arg(latitude_degrees, 0, 'f', 10).arg(longitude_degrees, 0, 'f', 10);
560 
561  QString positionString = coordinates.toString();
562 
563  QMimeData * const myMimeData = new QMimeData();
564  myMimeData->setText(positionString);
565  myMimeData->setData(QLatin1String("application/vnd.google-earth.kml+xml"), kmlRepresentation.toUtf8());
566  myMimeData->setData(QLatin1String("application/gpx+xml"), gpxRepresentation.toUtf8());
567 
568  QClipboard * const clipboard = QApplication::clipboard();
569  clipboard->setMimeData(myMimeData);
570  }
571 }
572 
573 void MarbleWidgetPopupMenu::slotAboutDialog()
574 {
575  MarbleAboutDialog dlg( d->m_widget );
576  dlg.exec();
577 }
578 
579 void MarbleWidgetPopupMenu::addAction( Qt::MouseButton button, QAction* action )
580 {
581  if ( button == Qt::RightButton ) {
582  d->m_rmbMenu->insertAction( d->m_rmbExtensionPoint, action );
583  }
584 }
585 
586 void MarbleWidgetPopupMenu::directionsFromHere()
587 {
588  RouteRequest* request = d->m_widget->model()->routingManager()->routeRequest();
589  if ( request )
590  {
591  GeoDataCoordinates coordinates;
592  if ( d->mouseCoordinates( &coordinates, d->m_copyCoordinateAction ) ) {
593  if ( request->size() > 0 ) {
594  request->setPosition( 0, coordinates );
595  } else {
596  request->append( coordinates );
597  }
598  d->m_widget->model()->routingManager()->retrieveRoute();
599  }
600  }
601 }
602 
603 void MarbleWidgetPopupMenu::directionsToHere()
604 {
605  RouteRequest* request = d->m_widget->model()->routingManager()->routeRequest();
606  if ( request )
607  {
608  GeoDataCoordinates coordinates;
609  if ( d->mouseCoordinates( &coordinates, d->m_copyCoordinateAction ) ) {
610  if ( request->size() > 1 ) {
611  request->setPosition( request->size()-1, coordinates );
612  } else {
613  request->append( coordinates );
614  }
615  d->m_widget->model()->routingManager()->retrieveRoute();
616  }
617  }
618 }
619 
620 bool MarbleWidgetPopupMenu::Private::mouseCoordinates( GeoDataCoordinates* coordinates, QAction* dataContainer )
621 {
622  Q_ASSERT( coordinates && "You must not pass 0 as coordinates parameter");
623  if ( !dataContainer ) {
624  return false;
625  }
626 
627  bool valid = true;
628  if ( !m_featurelist.isEmpty() ) {
629  *coordinates = m_featurelist.first()->coordinate( m_model->clock()->dateTime() );
630  } else {
631  QPoint p = dataContainer->data().toPoint();
632  qreal lat( 0.0 ), lon( 0.0 );
633 
634  valid = m_widget->geoCoordinates( p.x(), p.y(), lon, lat, GeoDataCoordinates::Radian );
635  if ( valid ) {
636  *coordinates = GeoDataCoordinates( lon, lat );
637  }
638  }
639 
640  return valid;
641 }
642 
643 void MarbleWidgetPopupMenu::startReverseGeocoding()
644 {
645  GeoDataCoordinates coordinates;
646  if ( d->mouseCoordinates( &coordinates, d->m_copyCoordinateAction ) ) {
647  d->m_runnerManager->reverseGeocoding( coordinates );
648  }
649 }
650 
651 void MarbleWidgetPopupMenu::showAddressInformation(const GeoDataCoordinates &, const GeoDataPlacemark &placemark)
652 {
653  QString text = placemark.address();
654  if ( !text.isEmpty() ) {
655  QMessageBox::information( d->m_widget, tr( "Address Details" ), text, QMessageBox::Ok );
656  }
657 }
658 
659 void MarbleWidgetPopupMenu::addBookmark()
660 {
661  GeoDataCoordinates coordinates;
662  if ( d->mouseCoordinates( &coordinates, d->m_copyCoordinateAction ) ) {
663  QPointer<EditBookmarkDialog> dialog = new EditBookmarkDialog( d->m_widget->model()->bookmarkManager(), d->m_widget );
664  dialog->setMarbleWidget( d->m_widget );
665  dialog->setCoordinates( coordinates );
666  dialog->setRange( d->m_widget->lookAt().range() );
667  dialog->setReverseGeocodeName();
668  if ( dialog->exec() == QDialog::Accepted ) {
669  d->m_widget->model()->bookmarkManager()->addBookmark( dialog->folder(), dialog->bookmark() );
670  }
671  delete dialog;
672  }
673 }
674 
675 void MarbleWidgetPopupMenu::toggleFullscreen( bool enabled )
676 {
677  QWidget* parent = d->m_widget;
678  for ( ; parent->parentWidget(); parent = parent->parentWidget() ) {
679  // nothing to do
680  }
681 
682  if ( enabled ) {
683  parent->setWindowState( parent->windowState() | Qt::WindowFullScreen );
684  } else {
685  parent->setWindowState( parent->windowState() & ~Qt::WindowFullScreen );
686  }
687 }
688 
689 QPoint MarbleWidgetPopupMenu::mousePosition() const
690 {
691  return d->m_mousePosition;
692 }
693 
694 }
695 
696 #include "MarbleWidgetPopupMenu.moc"
GeoSceneHead.h
Marble::RouteRequest::size
int size() const
Number of points in the route.
Definition: RouteRequest.cpp:126
Marble::GeoDataCoordinates
A 3d point representation.
Definition: GeoDataCoordinates.h:52
Marble::GeoDataCoordinates::Radian
Definition: GeoDataCoordinates.h:65
Marble::MarbleDirs::path
static QString path(const QString &relativePath)
Definition: MarbleDirs.cpp:53
MarbleModel.h
This file contains the headers for MarbleModel.
AbstractFloatItem.h
QWidget
Marble::RouteRequest::pixmap
QPixmap pixmap(int index, int size=-1, int margin=2) const
Returns a pixmap which indicates the position of the element.
Definition: RouteRequest.cpp:154
GeoDataStyle.h
GeoSceneDocument.h
Marble::RouteRequest::append
void append(const GeoDataCoordinates &coordinates, const QString &name=QString())
Add the given element to the end.
Definition: RouteRequest.cpp:218
GeoDataExtendedData.h
MarbleAboutDialog.h
Planet.h
QObject
Marble::GeoDataFeature::Nation
Definition: GeoDataFeature.h:98
Marble::MarbleWidgetPopupMenu::MarbleWidgetPopupMenu
MarbleWidgetPopupMenu(MarbleWidget *, const MarbleModel *)
Definition: MarbleWidgetPopupMenu.cpp:169
MarbleDebug.h
Marble::GeoDataCoordinates::Degree
Definition: GeoDataCoordinates.h:66
BookmarkManager.h
Marble::MarbleWidget
A widget class that displays a view of the earth.
Definition: MarbleWidget.h:102
Marble::RouteRequest
Points to be included in a route.
Definition: RouteRequest.h:31
RoutingManager.h
TemplateDocument.h
MarbleDirs.h
MarbleWidgetPopupMenu.h
Marble::MarbleWidgetPopupMenu::showRmbMenu
void showRmbMenu(int, int)
Definition: MarbleWidgetPopupMenu.cpp:276
Marble::MarbleWidgetPopupMenu::~MarbleWidgetPopupMenu
virtual ~MarbleWidgetPopupMenu()
Definition: MarbleWidgetPopupMenu.cpp:177
ReverseGeocodingRunnerManager.h
GeoDataPlacemark.h
Marble::GeoDataCoordinates::latToString
QString latToString() const
return a string representation of latitude of the coordinate convenience function that uses the defau...
Definition: GeoDataCoordinates.cpp:1176
EditBookmarkDialog.h
Marble::GeoDataCoordinates::lonToString
QString lonToString() const
return a string representation of longitude of the coordinate convenience function that uses the defa...
Definition: GeoDataCoordinates.cpp:1075
Marble::MarbleWidgetPopupMenu::showLmbMenu
void showLmbMenu(int, int)
Definition: MarbleWidgetPopupMenu.cpp:196
MarbleClock.h
Marble::MarbleGlobal::SmallScreen
Definition: MarbleGlobal.h:268
Marble::MarbleGlobal::getInstance
static MarbleGlobal * getInstance()
Definition: MarbleGlobal.cpp:37
Marble::MarbleWidgetPopupMenu::trackPlacemark
void trackPlacemark(const GeoDataPlacemark *placemark)
Marble::MarbleModel
The data model (not based on QAbstractModel) for a MarbleWidget.
Definition: MarbleModel.h:96
PopupLayer.h
Marble::GeoDataFeature::Satellite
Definition: GeoDataFeature.h:265
Marble::MarbleGlobal::profiles
Profiles profiles() const
Definition: MarbleGlobal.cpp:48
MarbleWidget.h
This file contains the headers for MarbleWidget.
RouteRequest.h
Marble::MarbleWidgetPopupMenu::addAction
void addAction(Qt::MouseButton button, QAction *action)
Adds the action to the menu associated with the specified mouse button.
Definition: MarbleWidgetPopupMenu.cpp:579
Marble::RouteRequest::setPosition
void setPosition(int index, const GeoDataCoordinates &position, const QString &name=QString())
Change the value of the element at the given position.
Definition: RouteRequest.cpp:249
MarbleWidget
Wraps a Marble::MarbleWidget, providing access to important properties and methods.
Definition: MarbleDeclarativeWidget.h:50
Marble::MarbleWidgetPopupMenu::mousePosition
QPoint mousePosition() const
mousePosition Position of the last mouse button click
Definition: MarbleWidgetPopupMenu.cpp:689
Marble::GeoDataFeature::LargeNationCapital
Definition: GeoDataFeature.h:97
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:31
AbstractDataPluginItem.h
Marble::GeoDataCoordinates::Astro
< "RA and DEC" notation (used for astronomical sky coordinates)
Definition: GeoDataCoordinates.h:84
Marble::GeoDataFeature::SmallCity
Definition: GeoDataFeature.h:82
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