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

marble

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