diff --git a/src/lib/marble/MarbleWidgetPopupMenu.cpp b/src/lib/marble/MarbleWidgetPopupMenu.cpp --- a/src/lib/marble/MarbleWidgetPopupMenu.cpp +++ b/src/lib/marble/MarbleWidgetPopupMenu.cpp @@ -26,6 +26,7 @@ #include "GeoDataPlacemark.h" #include "GeoDataSnippet.h" #include "GeoDataStyle.h" +#include "GeoDataIconStyle.h" #include "GeoDataTypes.h" #include "GeoDataPhotoOverlay.h" #include "GeoSceneDocument.h" @@ -41,6 +42,7 @@ #include "BookmarkManager.h" #include "ReverseGeocodingRunnerManager.h" #include "TemplateDocument.h" +#include "OsmPlacemarkData.h" // Qt #include @@ -96,6 +98,7 @@ static void setupDialogGeoPlaces( PopupLayer *popup, const GeoDataPlacemark *placemark ); static void setupDialogSkyPlaces( PopupLayer *popup, const GeoDataPlacemark *placemark ); static void setupDialogPhotoOverlay( PopupLayer *popup, const GeoDataPhotoOverlay *overlay); + static void setupDialogOsm( PopupLayer *popup, const GeoDataPlacemark* placemark ); }; MarbleWidgetPopupMenu::Private::Private( MarbleWidget *widget, const MarbleModel *model, MarbleWidgetPopupMenu* parent ) : @@ -345,6 +348,130 @@ popup->setContent(doc.finalText(), baseUrl ); } +void MarbleWidgetPopupMenu::Private::setupDialogOsm( PopupLayer *popup, const GeoDataPlacemark *placemark ) +{ + const GeoDataCoordinates location = placemark->coordinate(); + popup->setCoordinates(location, Qt::AlignRight | Qt::AlignVCenter); + + QFile descriptionFile(":/marble/webpopup/osm.html"); + if (!descriptionFile.open(QIODevice::ReadOnly)) { + return; + } + + QString description = descriptionFile.readAll(); + + OsmPlacemarkData data = placemark->osmData(); + + if (data.containsTagKey("name")){ + description = description.replace("%name%", data.tagValue("name")); + } else { + description = description.replace("

%name%

", ""); + } + if (data.containsTagKey("amenity")){ + description = description.replace("%amenity%", data.tagValue("amenity")); + } else { + description = description.replace("

%amenity%

", ""); + } + + if (data.containsTagKey("cuisine")){ + description = description.replace("%cuisine%", data.tagValue("cuisine")); + } else { + description = description.replace("

%cuisine%

", ""); + } + + if (data.containsTagKey("opening_hours")){ + description = description.replace("%openinghours%", data.tagValue("opening_hours")); + } else { + description = description.replace("

Opening Hours: %openinghours%

", ""); + } + + bool hasAddressData = false; + foreach(const QString &tag, QStringList() << "addr:street" << "addr:housenumber" << "addr:postcode" << "addr:city") { + if (data.containsTagKey(tag)){ + hasAddressData = true; + break; + } + } + + bool hasWebsiteData = false; + foreach(const QString &tag, QStringList() << "website" << "contact:website" << "facebook" << "contact:facebook" << "url") { + if (data.containsTagKey(tag)){ + hasWebsiteData = true; + break; + } + } + + bool hasPhoneData = data.containsTagKey("phone"); + + bool hasContactsData = hasAddressData || hasPhoneData || hasWebsiteData; + + if (hasContactsData){ + if (hasAddressData){ + if (!data.containsTagKey("addr:street") && !data.containsTagKey("addr:housenumber")){ + description = description.replace("
%postcode%", "%postcode%"); + } + foreach (const QString tag, QStringList() << "addr:street" << "addr:housenumber" << "addr:postcode" << "addr:city") { + if (data.containsTagKey(tag)){ + description = description.replace("%"+tag.split("addr:")[1]+"%", data.tagValue(tag)); + } else { + description = description.replace("%"+tag.split("addr:")[1]+"%", ""); + } + } + } else { + description = description.replace("\n Address:%street% %housenumber%
%postcode% %city%\n", ""); + } + + if (hasPhoneData){ + description = description.replace("%phone%", data.tagValue("phone")); + } else { + description = description.replace("\n Phone:%phone%\n", ""); + } + + if (hasWebsiteData){ + foreach(const QString tag, QStringList() << "website" << "contact:website" << "facebook" << "contact:facebook" << "url") { + if (data.containsTagKey(tag)){ + description = description.replace("%website%", data.tagValue(tag)); + break; + } + } + } else { + description = description.replace("\n Website:%website%\n", ""); + } + } else { + QString s1 = description.split("\n\n \n")[0]; + QString s2 = description.split("\n \n\n
Contact
Website:%website%
")[1]; + description = s1 + s2; + } + + if (data.containsTagKey("wheelchair") || data.containsTagKey("internet_access") || data.containsTagKey("smoking")){ + if (data.containsTagKey("wheelchair")){ + description = description.replace("%wheelchair%", data.tagValue("wheelchair")); + } else { + description = description.replace("\n Wheelchair access%wheelchair%\n", ""); + } + + if (data.containsTagKey("internet_access")){ + description = description.replace("%internetaccess%", data.tagValue("internet_access")); + } else { + description = description.replace("\n Internet%internetaccess%\n", ""); + } + + if (data.containsTagKey("smoking")){ + description = description.replace("%smoking%", data.tagValue("smoking")); + } else { + description = description.replace("\n Smoking%smoking%\n", ""); + } + } else { + QString s1 = description.split("\n\n \n")[0]; + QString s2 = description.split("\n \n\n
Popular Facilities
Smoking%smoking%
")[1]; + description = s1 + s2; + } + + TemplateDocument doc(description); + + popup->setContent(doc.finalText()); +} + MarbleWidgetPopupMenu::MarbleWidgetPopupMenu(MarbleWidget *widget, const MarbleModel *model) : QObject(widget), @@ -479,6 +606,13 @@ bool isCity = false; bool isNation = false; + OsmPlacemarkData data = placemark->osmData(); + bool hasOsmData = data.containsTagKey("name") || data.containsTagKey("amenity") || data.containsTagKey("cuisine") || data.containsTagKey("opening_hours") + || data.containsTagKey("addr:street") || data.containsTagKey("addr:housenumber") || data.containsTagKey("addr:postcode") || data.containsTagKey("addr:city") + || data.containsTagKey("phone") || data.containsTagKey("wheelchair") || data.containsTagKey("internet_access") || data.containsTagKey("smoking") + || data.containsTagKey("website") || data.containsTagKey("contact:website") || data.containsTagKey("facebook") || data.containsTagKey("contact:facebook") + || data.containsTagKey("url"); + if ( placemark ) { isSatellite = (placemark->visualCategory() == GeoDataFeature::Satellite); isCity = (placemark->visualCategory() >= GeoDataFeature::SmallCity && @@ -494,7 +628,9 @@ popup->setSize(QSizeF(400, 400)); - if (isSatellite) { + if (hasOsmData){ + Private::setupDialogOsm( popup, placemark ); + } else if (isSatellite) { d->setupDialogSatellite( placemark ); } else if (isCity) { Private::setupDialogCity( popup, placemark ); diff --git a/src/lib/marble/libmarble.qrc b/src/lib/marble/libmarble.qrc --- a/src/lib/marble/libmarble.qrc +++ b/src/lib/marble/libmarble.qrc @@ -98,6 +98,7 @@ webpopup/nation.html webpopup/skyplace.html webpopup/photooverlay.html + webpopup/osm.html htmlfeatures/bootstrap.min.css diff --git a/src/lib/marble/webpopup/osm.html b/src/lib/marble/webpopup/osm.html --- a/src/lib/marble/webpopup/osm.html +++ b/src/lib/marble/webpopup/osm.html @@ -29,7 +29,7 @@ Phone:%phone% - Website:%website% m + Website:%website%