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,135 @@ 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("%nameVisibility%", "none"); + } + + if (data.containsTagKey("shop")){ + QString shop = data.tagValue("shop"); + shop[0] = shop[0].toUpper(); + description = description.replace("%amenity%", "Shop - " + shop); + } else if (data.containsTagKey("amenity")){ + QString amenity = data.tagValue("amenity"); + amenity[0] = amenity[0].toUpper(); + description = description.replace("%amenity%", amenity); + } else { + description = description.replace("%amenityVisibility%", "none"); + } + + if (data.containsTagKey("cuisine")){ + QString cuisine = data.tagValue("cuisine"); + cuisine[0] = cuisine[0].toUpper(); + description = description.replace("%cuisine%", cuisine); + } else { + description = description.replace("%cuisineVisibility%", "none"); + } + + if (data.containsTagKey("opening_hours")){ + description = description.replace("%openinghours%", data.tagValue("opening_hours")); + } else { + description = description.replace("%openinghoursVisibility%", "none"); + } + + 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("%addressVisibility%", "none"); + } + + if (hasPhoneData){ + description = description.replace("%phone%", data.tagValue("phone")); + } else { + description = description.replace("%phoneVisibility%", "none"); + } + + 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("%websiteVisibility%", "none"); + } + } else { + description = description.replace("%contactVisibility%", "none"); + } + + 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("%wheelchairVisibility%", "none"); + } + + if (data.containsTagKey("internet_access")){ + description = description.replace("%internetaccess%", data.tagValue("internet_access")); + } else { + description = description.replace("%internetVisibility%", "none"); + } + + if (data.containsTagKey("smoking")){ + description = description.replace("%smoking%", data.tagValue("smoking")); + } else { + description = description.replace("%smokingVisibility%", "none"); + } + } else { + description = description.replace("%facilitiesVisibility%", "none"); + } + + TemplateDocument doc(description); + + popup->setContent(doc.finalText()); +} + MarbleWidgetPopupMenu::MarbleWidgetPopupMenu(MarbleWidget *widget, const MarbleModel *model) : QObject(widget), @@ -479,6 +611,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 +633,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 @@ -8,9 +8,60 @@ .flag { background-image:url('file://%amenity%'); } + +h1.name { + display: %nameVisibility% +} + +h2.osmamenity { + display: %amenityVisibility% +} + +h3.osmcuisine { + display: %cuisineVisibility% +} + +p.openinghours { + display: %openinghoursVisibility% +} + +table.contact { + display: %contactVisibility% +} + +tr.address { + display: %addressVisibility% +} + +tr.phone { + display: %phoneVisibility% +} + +tr.website { + display: %websiteVisibility% +} + +table.facilities { + display: %facilitiesVisibility% +} + +tr.wheelchair { + display: %wheelchairVisibility% +} + +tr.internet { + display: %internetVisibility% +} + +tr.smoking { + display: %smokingVisibility% +} + -

%name%

+
+

%name%

+

%amenity%

@@ -18,34 +69,34 @@

Opening Hours: %openinghours%

- +
- + - + - - + +
Contact
Address:%street% %housenumber%
%postcode% %city%
Phone:%phone%
Website:%website% m
Website:%website%

- +
- + - + - +
Popular Facilities
Wheelchair access%wheelchair%
Internet%internetaccess%
Smoking%smoking%