10 #include "MarbleWidgetPopupMenu.h"
13 #include "AbstractDataPluginItem.h"
14 #include "AbstractFloatItem.h"
15 #include "MarbleAboutDialog.h"
16 #include "MarbleDirs.h"
19 #include "GeoDataExtendedData.h"
20 #include "GeoDataFolder.h"
21 #include "GeoDataPlacemark.h"
22 #include "GeoDataLookAt.h"
23 #include "GeoDataData.h"
24 #include "GeoDataSnippet.h"
25 #include "GeoDataStyle.h"
26 #include "GeoDataBalloonStyle.h"
27 #include "GeoDataIconStyle.h"
28 #include "GeoDataPoint.h"
29 #include "GeoDataPhotoOverlay.h"
30 #include "GeoSceneDocument.h"
31 #include "GeoSceneHead.h"
32 #include "MarbleClock.h"
33 #include "MarbleDebug.h"
34 #include "PopupLayer.h"
36 #include "routing/RoutingManager.h"
37 #include "routing/RoutingLayer.h"
38 #include "routing/RouteRequest.h"
39 #include "EditBookmarkDialog.h"
40 #include "BookmarkManager.h"
41 #include "ReverseGeocodingRunnerManager.h"
42 #include "TemplateDocument.h"
43 #include "OsmPlacemarkData.h"
44 #include "StyleBuilder.h"
47 #include <QApplication>
54 #include <QMessageBox>
59 class Q_DECL_HIDDEN MarbleWidgetPopupMenu::Private {
61 const MarbleModel *
const m_model;
62 MarbleWidget *
const m_widget;
71 QAction *m_directionsFromHereAction;
72 QAction *m_directionsToHereAction;
74 QAction *
const m_copyCoordinateAction;
79 ReverseGeocodingRunnerManager m_runnerManager;
84 Private( MarbleWidget *widget,
const MarbleModel *model, MarbleWidgetPopupMenu* parent );
92 GeoDataCoordinates mouseCoordinates(
QAction* dataContainer )
const;
94 static QString filterEmptyShortDescription(
const QString &description );
95 void setupDialogOsm( PopupLayer *popup,
const GeoDataPlacemark* placemark );
96 void setupDialogSatellite(
const GeoDataPlacemark *placemark );
97 static void setupDialogCity( PopupLayer *popup,
const GeoDataPlacemark *placemark );
98 static void setupDialogNation( PopupLayer *popup,
const GeoDataPlacemark *placemark );
99 static void setupDialogGeoPlaces( PopupLayer *popup,
const GeoDataPlacemark *placemark );
100 static void setupDialogSkyPlaces( PopupLayer *popup,
const GeoDataPlacemark *placemark );
101 static void setupDialogPhotoOverlay( PopupLayer *popup,
const GeoDataPhotoOverlay *overlay);
104 MarbleWidgetPopupMenu::Private::Private( MarbleWidget *widget,
const MarbleModel *model, MarbleWidgetPopupMenu* parent ) :
107 m_lmbMenu( m_widget ),
108 m_rmbMenu( m_widget ),
109 m_directionsFromHereAction( nullptr ),
110 m_directionsToHereAction( nullptr ),
111 m_copyCoordinateAction(new
QAction(
QIcon(QStringLiteral(
":/icons/copy-coordinates.png")), tr(
"Copy Coordinates"), parent)),
112 m_copyGeoAction(new
QAction(
QIcon(QStringLiteral(
":/icons/copy-coordinates.png")), tr(
"Copy geo: URL"), parent)),
113 m_rmbExtensionPoint( nullptr ),
114 m_runnerManager( model )
118 m_infoDialogAction->setData( 0 );
121 m_directionsFromHereAction =
new QAction(
tr(
"Directions &from here" ),
parent );
122 m_directionsToHereAction =
new QAction(
tr(
"Directions &to here" ),
parent );
123 RouteRequest* request = m_widget->model()->routingManager()->routeRequest();
125 m_directionsFromHereAction->setIcon(
QIcon( request->pixmap( 0, 16 ) ) );
126 int const lastIndex = qMax( 1, request->size()-1 );
127 m_directionsToHereAction->setIcon(
QIcon( request->pixmap( lastIndex, 16 ) ) );
136 QMenu* infoBoxMenu = createInfoBoxMenu(m_widget);
138 const bool smallScreen = MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen;
140 if ( !smallScreen ) {
141 m_rmbExtensionPoint = m_rmbMenu.addSeparator();
144 m_rmbMenu.addAction( m_directionsFromHereAction );
145 m_rmbMenu.addAction( m_directionsToHereAction );
146 m_rmbMenu.addSeparator();
147 m_rmbMenu.addAction( addBookmark );
148 if ( !smallScreen ) {
149 m_rmbMenu.addAction( m_copyCoordinateAction );
150 m_rmbMenu.addAction( m_copyGeoAction );
152 m_rmbMenu.addAction(
QIcon(QStringLiteral(
":/icons/addressbook-details.png")),
tr(
"&Address Details"),
parent, SLOT(startReverseGeocoding()));
153 m_rmbMenu.addSeparator();
154 m_rmbMenu.addMenu( infoBoxMenu );
156 if ( !smallScreen ) {
157 m_rmbMenu.addAction( aboutDialogAction );
159 m_rmbMenu.addAction( fullscreenAction );
162 parent->
connect( &m_lmbMenu, SIGNAL(aboutToHide()), SLOT(resetMenu()) );
163 parent->
connect( m_directionsFromHereAction, SIGNAL(triggered()), SLOT(directionsFromHere()) );
164 parent->
connect( m_directionsToHereAction, SIGNAL(triggered()), SLOT(directionsToHere()) );
166 parent->
connect( aboutDialogAction, SIGNAL(triggered()), SLOT(slotAboutDialog()) );
167 parent->
connect( m_copyCoordinateAction, SIGNAL(triggered()), SLOT(slotCopyCoordinates()) );
168 parent->
connect( m_copyGeoAction, SIGNAL(triggered()), SLOT(slotCopyGeo()) );
169 parent->
connect( m_infoDialogAction, SIGNAL(triggered()), SLOT(slotInfoDialog()) );
170 parent->
connect( fullscreenAction, SIGNAL(triggered(
bool)),
parent, SLOT(toggleFullscreen(
bool)) );
172 parent->
connect( &m_runnerManager, SIGNAL(reverseGeocodingFinished(GeoDataCoordinates,GeoDataPlacemark)),
173 parent, SLOT(showAddressInformation(GeoDataCoordinates,GeoDataPlacemark)) );
176 QString MarbleWidgetPopupMenu::Private::filterEmptyShortDescription(
const QString &description)
179 return tr(
"No description available.");
183 void MarbleWidgetPopupMenu::Private::setupDialogOsm( PopupLayer *popup,
const GeoDataPlacemark *placemark )
185 const GeoDataCoordinates
location = placemark->coordinate();
188 QFile descriptionFile(QStringLiteral(
":/marble/webpopup/osm.html"));
193 const QString none = QStringLiteral(
"none");
195 QString description = descriptionFile.readAll();
196 const OsmPlacemarkData& data = placemark->osmData();
197 if (!data.containsTagKey(
"addr:street") && !data.containsTagKey(
"addr:housenumber")){
198 description.
replace(QStringLiteral(
"<br> %postcode%"), QStringLiteral(
"%postcode%"));
200 TemplateDocument doc(description);
202 doc[QStringLiteral(
"name")] = data.tagValue(QStringLiteral(
"name"));
204 QString natural = data.tagValue(QStringLiteral(
"natural"));
206 natural[0] = natural[0].
toUpper();
208 QString elevation = data.tagValue(QStringLiteral(
"ele"));
213 doc[QStringLiteral(
"details")] = natural;
215 doc[QStringLiteral(
"detailsVisibility")] = none;
219 QString shop = data.tagValue(QStringLiteral(
"shop"));
224 QString type = data.tagValue(QStringLiteral(
"clothes"));
225 if (
type.isEmpty()) {
226 type = data.tagValue(QStringLiteral(
"designation"));
228 if (!
type.isEmpty()) {
237 amenity = data.tagValue(QStringLiteral(
"amenity"));
239 amenity[0] = amenity[0].
toUpper();
243 doc[QStringLiteral(
"amenity")] = amenity;
245 doc[QStringLiteral(
"amenityVisibility")] = none;
248 QString cuisine = data.tagValue(QStringLiteral(
"cuisine"));
250 cuisine[0] = cuisine[0].
toUpper();
251 doc[QStringLiteral(
"cuisine")] = cuisine;
253 doc[QStringLiteral(
"cuisineVisibility")] = none;
256 QString openingHours = data.tagValue(QStringLiteral(
"opening_hours"));
258 doc[QStringLiteral(
"openinghours")] = openingHours;
260 doc[QStringLiteral(
"openinghoursVisibility")] = none;
263 bool hasContactsData =
false;
266 << QStringLiteral(
"street")
267 << QStringLiteral(
"housenumber")
268 << QStringLiteral(
"postcode")
269 << QStringLiteral(
"city");
270 bool hasAddressItem =
false;
272 for (
const QString& key: addressItemKeys) {
275 hasAddressItem =
true;
277 addressItems << item;
279 if (hasAddressItem) {
280 hasContactsData =
true;
281 for(
int i = 0; i < addressItemKeys.size(); ++i) {
282 doc[addressItemKeys[i]] = addressItems[i];
285 doc[QStringLiteral(
"addressVisibility")] = none;
288 QString phoneData = data.tagValue(QStringLiteral(
"phone"));
290 hasContactsData =
true;
291 doc[QStringLiteral(
"phone")] = phoneData;
293 doc[QStringLiteral(
"phoneVisibility")] = none;
297 auto const tags =
QStringList() <<
"website" <<
"contact:website" <<
"facebook" <<
"contact:facebook" <<
"url";
298 for(
const QString &tag: tags) {
299 websiteData = data.tagValue(tag);
305 hasContactsData =
true;
306 doc[QStringLiteral(
"website")] = websiteData;
308 doc[QStringLiteral(
"websiteVisibility")] = none;
311 if (!hasContactsData) {
312 doc[QStringLiteral(
"contactVisibility")] = none;
315 bool hasFacilitiesData =
false;
317 const QString wheelchair = data.tagValue(QStringLiteral(
"wheelchair"));
319 hasFacilitiesData =
true;
320 doc[QStringLiteral(
"wheelchair")] = wheelchair;
322 doc[QStringLiteral(
"wheelchairVisibility")] = none;
325 const QString internetAccess = data.tagValue(QStringLiteral(
"internet_access"));
326 if (!internetAccess.
isEmpty()) {
327 hasFacilitiesData =
true;
328 doc[QStringLiteral(
"internetaccess")] = internetAccess;
330 doc[QStringLiteral(
"internetVisibility")] = none;
333 const QString smoking = data.tagValue(QStringLiteral(
"smoking"));
335 hasFacilitiesData =
true;
336 doc[QStringLiteral(
"smoking")] = smoking;
338 doc[QStringLiteral(
"smokingVisibility")] = none;
341 if (!hasFacilitiesData) {
342 doc[QStringLiteral(
"facilitiesVisibility")] = none;
345 const QString flagPath = m_widget->styleBuilder()->createStyle(StyleParameters(placemark))->iconStyle().iconPath();
346 doc[
"flag"] = flagPath;
347 popup->setContent(doc.finalText());
350 void MarbleWidgetPopupMenu::Private::setupDialogSatellite(
const GeoDataPlacemark *placemark )
352 PopupLayer *
const popup = m_widget->popupLayer();
353 const GeoDataCoordinates
location = placemark->coordinate(m_widget->model()->clockDateTime());
356 const QString description = placemark->description();
357 TemplateDocument doc(description);
359 doc[
"latitude"] =
location.latToString();
360 doc[
"longitude"] =
location.lonToString();
361 popup->setContent(doc.finalText());
364 void MarbleWidgetPopupMenu::Private::setupDialogCity( PopupLayer *popup,
const GeoDataPlacemark *placemark )
366 const GeoDataCoordinates
location = placemark->coordinate();
369 QFile descriptionFile(QStringLiteral(
":/marble/webpopup/city.html"));
374 const QString description = descriptionFile.readAll();
375 TemplateDocument doc(description);
377 doc[
"name"] = placemark->name();
379 const QString role = placemark->role();
381 roleString = tr(
"National Capital");
383 roleString = tr(
"City");
385 roleString = tr(
"State Capital");
387 roleString = tr(
"County Capital");
390 roleString = tr(
"Capital");
398 roleString = tr(
"Village");
401 doc[
"category"] = roleString;
402 doc[
"shortDescription"] = filterEmptyShortDescription(placemark->description());
403 doc[
"latitude"] =
location.latToString();
404 doc[
"longitude"] =
location.lonToString();
407 doc[
"country"] = placemark->countryCode();
408 doc[
"state"] = placemark->state();
410 QString dst = QStringLiteral(
"%1").
arg((placemark->extendedData().value(QStringLiteral(
"gmt")).value().toInt() +
411 placemark->extendedData().value(QStringLiteral(
"dst")).value().toInt()) /
412 (
double ) 100, 0,
'f', 1 );
417 doc[
"timezone"] = dst;
422 const QString flagPath = MarbleDirs::path(
424 doc[
"flag"] = flagPath;
426 popup->setContent(doc.finalText());
429 void MarbleWidgetPopupMenu::Private::setupDialogNation( PopupLayer *popup,
const GeoDataPlacemark *index)
431 const GeoDataCoordinates
location = index->coordinate();
434 QFile descriptionFile(QStringLiteral(
":/marble/webpopup/nation.html"));
439 const QString description = descriptionFile.readAll();
440 TemplateDocument doc(description);
442 doc[
"name"] = index->name();
443 doc[
"shortDescription"] = filterEmptyShortDescription(index->description());
444 doc[
"latitude"] =
location.latToString();
445 doc[
"longitude"] =
location.lonToString();
450 const QString flagPath = MarbleDirs::path(
QString(
"flags/flag_%1.svg").arg(index->countryCode().toLower()) );
451 doc[
"flag"] = flagPath;
453 popup->setContent(doc.finalText());
456 void MarbleWidgetPopupMenu::Private::setupDialogGeoPlaces( PopupLayer *popup,
const GeoDataPlacemark *index)
458 const GeoDataCoordinates
location = index->coordinate();
461 QFile descriptionFile(QStringLiteral(
":/marble/webpopup/geoplace.html"));
466 const QString description = descriptionFile.readAll();
467 TemplateDocument doc(description);
469 doc[
"name"] = index->name();
470 doc[
"latitude"] =
location.latToString();
471 doc[
"longitude"] =
location.lonToString();
473 doc[
"shortDescription"] = filterEmptyShortDescription(index->description());
475 popup->setContent(doc.finalText());
478 void MarbleWidgetPopupMenu::Private::setupDialogSkyPlaces( PopupLayer *popup,
const GeoDataPlacemark *index)
480 const GeoDataCoordinates
location = index->coordinate();
483 QFile descriptionFile(QStringLiteral(
":/marble/webpopup/skyplace.html"));
488 const QString description = descriptionFile.readAll();
489 TemplateDocument doc(description);
491 doc[
"name"] = index->name();
496 doc[
"shortDescription"] = filterEmptyShortDescription(index->description());
498 popup->setContent(doc.finalText());
501 void MarbleWidgetPopupMenu::Private::setupDialogPhotoOverlay( PopupLayer *popup,
const GeoDataPhotoOverlay *index )
503 const GeoDataCoordinates
location = index->point().coordinates();
506 QFile descriptionFile(QStringLiteral(
":/marble/webpopup/photooverlay.html"));
512 const QString description = descriptionFile.readAll();
513 TemplateDocument doc(description);
514 doc[
"name"] = index->name();
515 doc[
"latitude"] =
location.latToString();
516 doc[
"longitude"] =
location.lonToString();
518 doc[
"shortDescription"] = filterEmptyShortDescription(index->description());
519 doc[
"source"] = index->absoluteIconFile();
522 QString const basePath = index->resolvePath(
".");
524 popup->setContent(doc.finalText(), baseUrl );
527 MarbleWidgetPopupMenu::MarbleWidgetPopupMenu(MarbleWidget *widget,
528 const MarbleModel *model)
530 d( new Private( widget, model, this ) )
535 MarbleWidgetPopupMenu::~MarbleWidgetPopupMenu()
540 QMenu* MarbleWidgetPopupMenu::Private::createInfoBoxMenu(
QWidget* parent)
542 QMenu* menu =
new QMenu(tr(
"&Info Boxes"), parent);
547 for (; iter !=
end; ++iter )
554 void MarbleWidgetPopupMenu::showLmbMenu(
int xpos,
int ypos )
556 bool const smallScreen = MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen;
558 showRmbMenu( xpos, ypos );
562 d->m_mousePosition.setX(xpos);
563 d->m_mousePosition.setY(ypos);
566 d->m_featurelist = d->m_widget->whichFeatureAt( curpos );
572 for (; it != itEnd; ++it )
576 d->m_infoDialogAction->setData( actionidx );
577 d->m_infoDialogAction->setText( name );
578 d->m_infoDialogAction->setIcon( icon );
580 QAction *firstAction =
nullptr;
581 if( !d->m_lmbMenu.actions().isEmpty() ) {
582 firstAction = d->m_lmbMenu.actions().first();
584 d->m_lmbMenu.insertAction( firstAction, d->m_infoDialogAction );
588 d->m_itemList = d->m_widget->whichItemAt( curpos );
591 for (; itW != itWEnd; ++itW )
593 for (
QAction* action: (*itW)->actions() ) {
594 d->m_lmbMenu.addAction( action );
598 switch ( d->m_lmbMenu.actions().size() ) {
604 d->m_lmbMenu.clear();
608 d->m_lmbMenu.popup( d->m_widget->mapToGlobal( curpos ) );
613 void MarbleWidgetPopupMenu::showRmbMenu(
int xpos,
int ypos )
616 const bool visible = d->m_widget->geoCoordinates( xpos, ypos, lon, lat, GeoDataCoordinates::Radian );
620 d->m_mousePosition.setX(xpos);
621 d->m_mousePosition.setY(ypos);
624 d->m_copyCoordinateAction->setData( curpos );
625 d->m_copyGeoAction->setData( curpos );
627 bool const showDirectionButtons = d->m_widget->routingLayer() && d->m_widget->routingLayer()->isInteractive();
628 d->m_directionsFromHereAction->setVisible( showDirectionButtons );
629 d->m_directionsToHereAction->setVisible( showDirectionButtons );
630 RouteRequest* request = d->m_widget->model()->routingManager()->routeRequest();
632 int const lastIndex = qMax( 1, request->size()-1 );
633 d->m_directionsToHereAction->setIcon(
QIcon( request->pixmap( lastIndex, 16 ) ) );
636 d->m_rmbMenu.popup( d->m_widget->mapToGlobal( curpos ) );
639 void MarbleWidgetPopupMenu::resetMenu()
641 d->m_lmbMenu.clear();
644 void MarbleWidgetPopupMenu::slotInfoDialog()
647 if ( action ==
nullptr ) {
648 mDebug() <<
"Warning: slotInfoDialog should be called by a QAction signal";
654 if ( actionidx > 0 ) {
655 const GeoDataPlacemark *placemark =
dynamic_cast<const GeoDataPlacemark*
>(d->m_featurelist.at( actionidx -1 ));
656 const GeoDataPhotoOverlay *overlay =
dynamic_cast<const GeoDataPhotoOverlay*
>(d->m_featurelist.at( actionidx - 1 ));
657 PopupLayer* popup = d->m_widget->popupLayer();
658 bool isSatellite =
false;
660 bool isNation =
false;
662 const OsmPlacemarkData& data = placemark->osmData();
664 bool hasOsmData =
false;
667 recognizedTags <<
"name" <<
"amenity" <<
"cuisine" <<
"opening_hours";
668 recognizedTags <<
"addr:street" <<
"addr:housenumber" <<
"addr:postcode";
669 recognizedTags <<
"addr:city" <<
"phone" <<
"wheelchair" <<
"internet_access";
670 recognizedTags <<
"smoking" <<
"website" <<
"contact:website" <<
"facebook";
671 recognizedTags <<
"contact:facebook" <<
"url";
673 for(
const QString &tag: recognizedTags) {
674 if (data.containsTagKey(tag)) {
681 isSatellite = (placemark->visualCategory() == GeoDataPlacemark::Satellite);
682 isCity = (placemark->visualCategory() >= GeoDataPlacemark::SmallCity &&
683 placemark->visualCategory() <= GeoDataPlacemark::LargeNationCapital);
684 isNation = (placemark->visualCategory() == GeoDataPlacemark::Nation);
689 if ( d->m_widget->model()->mapTheme() ) {
690 isSky = d->m_widget->model()->mapTheme()->head()->target() ==
QLatin1String(
"sky");
693 popup->setSize(
QSizeF(420, 420));
696 d->setupDialogOsm( popup, placemark );
697 }
else if (isSatellite) {
698 d->setupDialogSatellite( placemark );
700 Private::setupDialogCity( popup, placemark );
701 }
else if (isNation) {
702 Private::setupDialogNation( popup, placemark );
704 Private::setupDialogSkyPlaces( popup, placemark );
705 }
else if ( overlay ) {
706 Private::setupDialogPhotoOverlay( popup, overlay );
707 }
else if ( placemark && placemark->role().isEmpty() ) {
708 popup->setContent( placemark->description() );
709 }
else if ( placemark ) {
710 Private::setupDialogGeoPlaces( popup, placemark );
714 if ( placemark->style() ==
nullptr ) {
719 if ( placemark->style()->balloonStyle().displayMode() == GeoDataBalloonStyle::Hide ) {
720 popup->setVisible(
false);
724 QString content = placemark->style()->balloonStyle().text();
725 if (content.
length() > 0) {
732 QString const basePath = placemark->resolvePath(
".");
734 popup->setContent(content, baseUrl );
737 popup->setBackgroundColor(placemark->style()->balloonStyle().backgroundColor());
738 popup->setTextColor(placemark->style()->balloonStyle().textColor());
745 void MarbleWidgetPopupMenu::slotCopyCoordinates()
747 const GeoDataCoordinates coordinates = d->mouseCoordinates( d->m_copyCoordinateAction );
748 if ( coordinates.isValid() ) {
749 const qreal longitude_degrees = coordinates.longitude(GeoDataCoordinates::Degree);
750 const qreal latitude_degrees = coordinates.latitude(GeoDataCoordinates::Degree);
755 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
756 "<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n"
761 " <coordinates>%1,%2</coordinates>\n"
766 ).
arg(longitude_degrees, 0,
'f', 10).
arg(latitude_degrees, 0,
'f', 10);
770 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>\n"
771 "<gpx xmlns=\"http://www.topografix.com/GPX/1/1\" creator=\"trippy\" version=\"0.1\"\n"
772 " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
773 " xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\">\n"
774 " <wpt lat=\"%1\" lon=\"%2\">\n"
780 ).
arg(latitude_degrees, 0,
'f', 10).
arg(longitude_degrees, 0,
'f', 10);
782 QString positionString = coordinates.toString();
785 myMimeData->
setText(positionString);
794 void MarbleWidgetPopupMenu::slotCopyGeo()
796 const GeoDataCoordinates coordinates = d->mouseCoordinates( d->m_copyCoordinateAction );
797 if ( coordinates.isValid() ) {
798 const qreal latitude_degrees = coordinates.latitude(GeoDataCoordinates::Degree);
799 const qreal longitude_degrees = coordinates.longitude(GeoDataCoordinates::Degree);
802 QList<QUrl> urls = {
QUrl(
QString(
"geo:%1,%2").arg(latitude_degrees, 0,
'f', 10).arg(longitude_degrees, 0,
'f', 10)) };
810 void MarbleWidgetPopupMenu::slotAboutDialog()
820 d->m_rmbMenu.insertAction( d->m_rmbExtensionPoint, action );
822 d->m_lmbMenu.addAction( action );
826 void MarbleWidgetPopupMenu::directionsFromHere()
828 RouteRequest* request = d->m_widget->model()->routingManager()->routeRequest();
831 const GeoDataCoordinates coordinates = d->mouseCoordinates( d->m_copyCoordinateAction );
833 if ( request->
size() > 0 ) {
836 request->
append( coordinates );
838 d->m_widget->model()->routingManager()->retrieveRoute();
843 void MarbleWidgetPopupMenu::directionsToHere()
845 RouteRequest* request = d->m_widget->model()->routingManager()->routeRequest();
848 const GeoDataCoordinates coordinates = d->mouseCoordinates( d->m_copyCoordinateAction );
849 if ( coordinates.isValid() ) {
850 if ( request->size() > 1 ) {
851 request->setPosition( request->size()-1, coordinates );
853 request->append( coordinates );
855 d->m_widget->model()->routingManager()->retrieveRoute();
860 GeoDataCoordinates MarbleWidgetPopupMenu::Private::mouseCoordinates(
QAction* dataContainer )
const
862 if ( !dataContainer ) {
863 return GeoDataCoordinates();
866 if ( !m_featurelist.isEmpty() && geodata_cast<GeoDataPlacemark>(m_featurelist.first())) {
867 const GeoDataPlacemark * placemark =
static_cast<const GeoDataPlacemark*
>( m_featurelist.first() );
868 return placemark->coordinate( m_model->clock()->dateTime() );
871 qreal lat( 0.0 ), lon( 0.0 );
873 const bool valid = m_widget->geoCoordinates( p.
x(), p.
y(), lon, lat, GeoDataCoordinates::Radian );
875 return GeoDataCoordinates( lon, lat );
879 return GeoDataCoordinates();
882 void MarbleWidgetPopupMenu::startReverseGeocoding()
884 const GeoDataCoordinates coordinates = d->mouseCoordinates( d->m_copyCoordinateAction );
885 if ( coordinates.isValid() ) {
886 d->m_runnerManager.reverseGeocoding( coordinates );
890 void MarbleWidgetPopupMenu::showAddressInformation(
const GeoDataCoordinates &,
const GeoDataPlacemark &placemark)
892 QString text = placemark.address();
898 void MarbleWidgetPopupMenu::addBookmark()
900 const GeoDataCoordinates coordinates = d->mouseCoordinates( d->m_copyCoordinateAction );
901 if ( coordinates.isValid() ) {
903 dialog->setMarbleWidget( d->m_widget );
904 dialog->setCoordinates( coordinates );
905 dialog->setRange( d->m_widget->lookAt().range() );
906 dialog->setReverseGeocodeName();
908 d->m_widget->model()->bookmarkManager()->addBookmark( dialog->folder(), dialog->bookmark() );
914 void MarbleWidgetPopupMenu::toggleFullscreen(
bool enabled )
930 return d->m_mousePosition;
935 #include "moc_MarbleWidgetPopupMenu.cpp"